abap objects

Upload: hmpjcoelho

Post on 08-Jul-2015

211 views

Category:

Documents


3 download

TRANSCRIPT

OOP em ABAP

Programao orientada a objeto em Abap/4

Carlos Eduardo Candido de Oliveira Consultor Abap - Aspen BH [email protected]

1/70

OOP em ABAP

PRINCIPAL OBJETIVO DA ORIENTAO A OBJETO........................................... 4 TAD, CLASSES E OBJETOS ....................................................................................... 4 A LINGUAGEM ABAP ORIENTADA A OBJETO? ................................................ 4 VISIBILIDADE................................................................................................................. 4 HELP.SAP.COM ............................................................................................................. 5 O QUE ORIENTAO A OBJETO? ............................................................................... 5 Usos de Orientaao a Objeto...................................................................................... 6 Leitura Posterior........................................................................................................ 7 O ambiente de tempo de execuo .............................................................................. 9 A extenso da linguagem orientada a objeto .............................................................. 9 DE GRUPOS DE FUNES A OBJETOS ............................................................................... 9 Classes..................................................................................................................... 13 Objetos como Instancias de uma Classe ................................................................... 15 Declarando Mtodos ................................................................................................ 25 Implementando Mtodos .......................................................................................... 26 Chamando Mtodos.................................................................................................. 26 Mtodos de Manipulao de Eventos........................................................................ 27 Constructors............................................................................................................. 28 MTODOS EM OBJETOS ABAP - EXEMPLO ................................................................ 28 Viso Geral .............................................................................................................. 28 HERANA ................................................................................................................. 39 Redefinindo Mtodos................................................................................................ 40 Mtodos e Classes Abstratos e Finais....................................................................... 40 Referncias a Subclasses e Polimorfismo ................................................................. 41 Espao de Nomes para Componentes ....................................................................... 41 Herana e Atributos Estticos .................................................................................. 41 Herana e Constructors............................................................................................ 42 GRFICO GERAL DE HERANA .................................................................................. 44 Herana: Viso Geral .............................................................................................. 44 Herana Simples ...................................................................................................... 45 Herana e Variveis Referenciais............................................................................. 46 INTERFACES ............................................................................................................. 47 Definindo Interfaces................................................................................................. 48 Implementando Interfaces ........................................................................................ 48 Referncia de Interface ............................................................................................ 49 Endereando Objetos Usando Referncias de Interfaces .......................................... 49 Atribuio Usando Referncias de Interfaces ........................................................... 50 GRFICOS GERAIS .................................................................................................... 51

2/70

OOP em ABAPInterfaces ................................................................................................................. 51 INTERFACES - EXEMPLO INTRODUTRIO ................................................................... 52 ATIVANDO E MANIPULANDO EVENTOS ..................................................................... 56 Ativando Eventos...................................................................................................... 56 Declarando Eventos ................................................................................................. 56 Disparando Eventos ................................................................................................. 57 Manipulando Eventos............................................................................................... 57 Declarando Mtodos de Manipulao de Eventos .................................................... 57 Registrando Mtodos de Manipulo de Eventos...................................................... 57 Timing de Manipulao de Eventos.......................................................................... 58 GRFICO GERAL - EVENTOS ..................................................................................... 58 EVENTOS: EXEMPLO INTRODUTRIO ......................................................................... 61 EVENTOS EM OBJETOS ABAP - EXEMPLO ................................................................. 62 Viso Geral .............................................................................................................. 62 POOL DE CLASSES .................................................................................................... 68 Classes Globais e Interfaces..................................................................................... 68 Estrutura de um Pool de classes ............................................................................... 68 Diferenas De Outros Programas ABAP .................................................................. 69 Classes Locais em Pool de Classes........................................................................... 70

3/70

OOP em ABAP

Principal objetivo da orientao a objeto.Reaproveitamento de cdigo.

TAD, Classes e objetosTAD(Tipo Abstrato de Dados) so estruturas que visam representar objetos do mundo real em uma forma computacional. So compostos de atributos e mtodos. Os atributos so os dados referentes ao TAD e devem ser manipulados apenas pelo mtodos que so operaes que alteram o ambiente e os atributos. Os mtodos disponibilizam aos desenvolvedores as funcionalidades do TAD. As Classes so TAD propriamente definidos e implementados por um desenvolvedor como um tipo no nativo da linguagem. Em uma analogia simples, as classes so molduras, formas de onde iro nascer vrias representaes dela. Cada representao (instncia) de uma classe recebe o nome de objeto. Cada objeto alocado em diferentes posies da memria.

A linguagem ABAP orientada a objeto?Sim. Uma linguagem para ser considerada como orientada a objeto deve possibilitar os seguintes recursos: o Classes e objetos o Herana o Polimorfismo O ABAP disponibiliza tais recursos. A linguagem, porm, no totalmente orientada a objetos por combinar elementos estruturados e no estruturados. Os conceitos de OOP apresentados na linguagem ABAP so os mesmos em sua maioria apresentados pela linguagem JAVA como classes finais, abstratas, coletor de lixo e herana simples.

VisibilidadeAtributos e mtodos podem ser pblicos, privados ou protegidos.

PblicoPodem ser acessados e modificados de dentro e de fora dos domnios da classe. O acesso direto aos atributos de fora da classe deve ser evitado. PUBLIC SECTION. DATA: Counter type i.

PrivadoAtributos e mtodos definidos como privados no podem ser acessados fora dos domnios da classe. PRIVATE SECTION. DATA: name(25) TYPE c,

4/70

OOP em ABAPplanetype LIKE saplane-planetyp,

No R3 pode-se definir classes atravs da transao SE24 ou no prprio corpo do programa Abap.

Nas pastas pblicas, recomendo a leitura da apostila OOP em ABAP e Class Builder. A seguir, temos o material traduzido sobre Abap Objects extrado do help.sap.com.

Help.sap.com

O que Orientao a Objeto?Orientao a objeto, ou para ser mais preciso, programao orientada a objeto, um mtodo de resoluo de problemas no qual o soluo do software reflete objetos do mundo real. Uma introduo compreensiva a orientao a objeto como um todo iria muito alm dos limites da introduo aos objetos ABAP. Esta documentao introduz uma seleo de termos que so usados universalmente na orientao a objeto e tambm ocorre em objetos ABAP. Em sesses

5/70

OOP em ABAPsubseqentes, continua-se a discutir em mais detalhes como esses termos so usados em objetos ABAP. O fim desta seo contm uma lista de leitura posterior, com uma seleo de ttulos sobre orientao a objeto. Objetos Um objeto seo de cdigo que contm dados e fornece servios. Os dados formam os atributos do objeto. Os servios so conhecidos como mtodos (tambm conhecido como operaes ou funes). Tipicamente, mtodos operam em dados privados (os atributos, ou estado do objeto), que apenas visvel para os mtodos do objeto. Logo os atributos de um objeto no podem ser modificados diretamente pelo usurio, mas apenas pelos mtodos do objeto. Isso garante a consistncia interna do objeto. Classes Classes descrevem objetos. De um ponto de vista tcnico, objetos so instancias em tempo de execuo de uma classe. Em teoria, voc pode criar qualquer nmero de objetos baseados em uma nica classe. Cada instancia (objeto) de uma classe tem uma identidade nica e seu prprio conjunto de valores para seus atributos. Referncias a Objetos Em um programa, voc identifica e enderea objetos usando referncias nicas a objetos. Referncias a objetos permitem que acesse os atributos e mtodos de um objeto. Em programao orientada a objeto, objetos geralmente tm as seguintes propriedades: Encapsulamento Objetos restringem a visibilidade de seus recursos (atributos e mtodos) aos outros usurios. Todo objeto tem uma interface, que determina como os outros objetos podem interagir com ele. A implementao do objeto encapsulada, isso , invisvel for a do prprio objeto. Polimorfismo Mtodos idnticos (mesmo nome) se comportam diferentemente em diferentes classes. Orientao orientada a objeto contm construes chamadas interfaces. Elas permitem que enderece mtodos com mesmo nome em diferentes objetos. Apesar de a forma de endereamento sempre a mesma, a implementao do mtodo especfica a uma particular classe.

Herana Voc pode usar uma classe existente para derivar uma classe nova. Classes derivadas herdam os dados e mtodos da superclasse. No entanto, eles podem substituir mtodos existentes, e tambm adicionar novos.

Usos de Orientaao a ObjetoAbaixo esto algumas vantagens da programao orientada a objeto: Sistemas de software complexos se tornam mais fceis de serem compreendidos, j que a estrutura orientada a objeto fornece uma representao muito mais prxima da realidade do que as outras tcnicas de programao.

6/70

OOP em ABAP Em um sistema orientado a objeto bem desenvolvido, possvel implementar mudanas em nvel de classe, sem ter que realizar alteraes em outros pontos do sistema. Isto reduz a quantidade total de manuteno requerida. Atravs do polimorfismo e herana, a programao orientada a objeto permite a reutilizao de componentes individuais. Em um sistema orientado a objeto, a quantidade de trabalho de manuteno e reviso envolvido reduzida, j que muitos problemas podem ser detectados e corrigidos em fase de projeto.

Para atingir estes objetivos requer: Linguagens de programao orientada a objetos Tcnicas de programao orientadas a objeto no necessariamente dependem em linguagens de programao orientada a objeto. No entanto, a eficincia da programao orientada a objeto depende diretamente de como as tcnicas de programao orientada a objetos so implementadas no sistema kernel. Ferramentas de orientao a objeto Ferramentas de orientao a objeto permite que se crie programas orientados a objetos em linguagem orientada a objetos. Eles permitem que se modele e guarde objetos e relaes entre eles. Modelagem orientada a objeto A modelagem orientada a objeto de um sistema de software o mais importante, mais demorado, e o requerimento mais difcil para alcanar acima dos objetivos. Design orientado a objeto envolve mais do que apenas programao orientada a objeto, e fornece vantagens lgicas que so independentes da verdadeira implementao. Esta seo do guia do usurio ABAP fornece uma viso geral da extenso orientada a objeto da linguagem ABAP. Ns temos usado apenas exemplos simples para demonstrar como se utilizam as novas ferramentas. No entanto, estas pretendem ser um modelo para design orientado a objeto. Mais informao detalhada sobre cada dos comandos dos objetos ABAP contida na documentao de palavras chaves no editor ABAP. Para uma introduo compreensiva ao desenvolvimento de software orientado a objeto, voc deve ler um ou mais ttulos listados abaixo.

Leitura PosteriorH muitos livros sobre orientao a objeto, linguagem de programao orientado a objeto, anlise orientada a objeto e design, gerenciamento de projeto para projetos OO, padres e frameworks, e muitos outros. Esta uma pequena seleo de bons livros cobrindo os tpicos principais: Scott Ambler, The Object Primer, SIGS Books & Multimedia (1996), ISBN: 1884842178 Uma introduo muito boa orientao a objetos para programadores. Ele fornece explicaes compreensivas de todas as essncias dos conceitos OO, e contm um modo de aprendizagem muito rpido e eficiente. fcil e prtico de se ler, mas totalmente baseado em teoria. Grady Booch, Object Solutions: Managing the Object-Oriented Project, AddisonWesley Pub Co (1995), ISBN: 0805305947

7/70

OOP em ABAPUm bom livro sobre todos os aspectos no tcnicos de OO que so igualmente importantes para uma efetiva programao orientada a objeto. Fcil de ler e cheio de dicas prticas. Martin Fowler, UML Distilled: Applying the Standard Object Modeling Language, Addison-Wesley Pub Co (1997), ISBN: 0201325632 Um excelente livro sobre UML (Modelagem de Linguagem Unificada a nova liguagem padronizada OO e notaes para modelagem). Assume conhecimento anterior e experincia em orientao a objeto. Erich Gamma, Richard Helm, Ralph Johnson and John Vlissides, Design Patterns. Elements of Reusable Object-Oriented Software, Addison-Wesley Pub Co (1998), ISBN: 0201634988 Fornece um padro, mostrando como problemas de design recorrentes podem ser resolvidos utilizando objetos. Este o primeiro grande livro padro, contendo muitos exemplos de bom design OO. James Rumbaugh, OMT Insights: Perspectives on Modeling from the Journal of Object-Oriented Programming, Prentice Hall (1996), ISBN: 0138469652 Uma coleo de artigos endereando muitas perguntas e problemas de anlise e design OO, implementao, gerenciamento de dependncia, e muitos outros. Altamente recomendado.

Notas Se voc novo a orientao a objetos, voc deveria ler Scott Amblers The Object Primer e ento adquirir alguma experincia prtica voc prprio. Voc deve definitivamente utilizar as tcnicas CRC descritas por Ambler e Fowler para anlise e design orientados a objeto. Aps isso, voc deve aprender UML, j que este a anlise e design OO universal. Finalmente, voc deve ler pelo menos um dos livros sobre padres. No incio de um grande projeto OO, as questes imediatamente emergem sobre como a seqncia que as coisas devem ser feitas, quais fases devem terminar e a qual hora, como dividir e organizar o trabalho de desenvolvimento, como minimizar riscos, como montar uma boa equipe, e assim continua. Muitas das melhores prticas em gerenciamento de projetos tiveram que ser redefinidas para o mundo orientado a objeto, e as oportunidades que isto produz so significantes. Para mais informaes sobre como utilizar, veja o livro de Gradys Brooch Object Solutions , ou o captulo intitulado An outline development process do livro de Martin Fowler. H, claro, muitos outros livros bons sobre orientao a objeto. Os acima listados no clamam estarem totalmente completos, ou necessariamente os melhores livros disponveis.

8/70

OOP em ABAP O que so Objetos ABAP?Objetos ABAP so um novo conceito do R/3 Release 4.0. O termo tem dois conceitos. No primeiro, os objetos compem todo o ambiente de tempo de execuo ABAP. No segundo, ele representa a extenso orientada a objeto da linguagem ABAP.

O ambiente de tempo de execuoO novo nome ABAP Objects para todo o ambiente de tempo de execuo uma indicao do modo que o SAP R3 tem, por algum tempo, movendo em direo a orientao a objeto, e de seu compromisso em perseguir esta linha. O ABAP Workbench permite que voc crie objetos R/3 Repository, como programas, objetos de autorizao, objetos de travamento, objetos de customizing, e muitos outros. Usando mdulos de funes, voc pode encapsular funes em programas separados com uma interface definida. O Business Object Repository (BOR) permite que voc cria SAP Business Objects para uso interno e externo (DCOM/CORBA). At agora, as tcnicas de orientao a objeto tm sido usadas exclusivamente em projeto de sistemas, e ainda no foram suportadas pela linguagem ABAP.

A extenso da linguagem orientada a objetoObjetos ABAP so um conjunto completo de comandos que foram introduzidos dentro da linguagem ABAP. Esta extenso orientada a objeto constri sobre a linguagem existente, sendo totalmente compatvel com ela. Voc pode utilizar objetos ABAP em j programas existentes, e pode tambm usar o ABAP convencional em novos objetos de programas ABAP. Objetos ABAP suporta programao orientada a objeto. Orientao a objeto (OO), tambm conhecida como paradigma orientado a objeto, um modelo de programao que une dados e funes em objetos. O resto da linguagem ABAP primeiramente intencionado para programao estruturada, onde os dados so guardados em tabelas de banco de dados e programas orientados por funes acessam e trabalham com eles. A implementao do modelo orientado a objeto do ABAP baseado em modelos de Java e C++. compatvel com objetos externos como DCOM e CORBA. A implementao de elementos orientados a objeto no kernel da linguagem ABAP tem aumentado consideravelmente o tempo de resposta quando se trabalha com objetos ABAP. SAP Business Objects e objetos GUI vo tambm lucrar de serem incorporados nos objetos ABAP.

De Grupos de Funes a ObjetosNo centro de qualquer modelo orientado a objeto esto os objetos, que contm atributos (dados) e mtodos (funes). Objetos deveriam permitir programadores a mapear um problema real e solues propostas do software em uma base um-por-um. Objetos tpicos no ambiente de negcios so, por exemplo, consumidor, ordem, ou pedido. Do release 3.1 em diante, o Business Object Repository (BOR) contm exemplos de tais objetos. O objeto modelo dos objetos ABAP, a extenso orientada a objeto do ABAP, so compatveis com o objeto modelo do BOR. Antes do R/3 Release 4.0, o que existia mais prximo de objetos no ABAP eram mdulos de funes e grupos de funes. Suponha que tenhamos um grupo de funes para processar ordens. Os atributos de uma ordem correspondem aos dados globais do grupo de funo, enquanto os mdulos de funes individuais representam aes que manipulam aqueles dados (mtodos). Isto significa que a verdadeira ordem dos dados encapsulada no grupo de funes. Deste modo, os mdulos de funes podem garantir que os dados so consistentes.

9/70

OOP em ABAPQuando voc executa um programa ABAP, o sistema inicia uma nova sesso interna. A sesso interna tem uma rea de memria que contm o programa ABAP e os dados associados.Quando voc chama um mdulo de funo, uma instancia de um grupo de funes mais seus dados, carregado na memria da sesso interna. Um programa ABAP pode carregar vrias instancias atravs da chamada de mdulos de funes de diferentes grupos de funes.

A instancia de um grupo de funes na rea de memria de uma sesso interna quase representa um objeto no senso de orientao a objeto. Quando voc chama um modulo de funo, o programa chamador usa a instancia de um grupo de funes, baseada na descrio usada no Function Builder. O programa no pode acessar os dados no grupo de funes diretamente, mas apenas atravs do modulo de funo. Os mdulos de funes e seus parmetros so a interface entre o grupo de funes e o usurio. A diferena principal entre a real orientao a objeto e grupo de funes que apesar de um programa poder trabalhar com instancias de diversos grupos de funes simultaneamente, ele no pode trabalhar com diversas instancias do mesmo grupo de funes. Suponha que um programa necessite vrios contadores independentes, ou processar vrias ordens ao mesmo tempo. Neste caso, voc teria que adaptar o grupo de funes a incluir administrao de instancia, por exemplo, usando nmeros para diferenci-las. Na prtica, isto muito estranho. Conseqentemente, os dados so usualmente guardados no programa chamador, e os mdulos de funes so chamados para trabalhar com ele (programao estruturada). Um problema , por exemplo, que todos os usurios do mdulo de funo devem utilizar os mesmos dados assim como o grupo de funes. Modificando a estrutura interna dos dados de um grupo de funes afeta vrios usurios, e freqentemente difcil de prever implicaes. O nico modo de evitar depender muito de interfaces e de uma tcnica que garante que as estruturas internas das instancias vo permanecer ocultas, permitindo que as modifique mais tarde sem causar problemas.

10/70

OOP em ABAPEste requisito atingido por orientao a objeto. Objetos ABAP permitem que voc defina dados e funes em classes ao invs de grupo de funes. Usando classes, um programa ABAP pode trabalhar com qualquer nmero de instancias (objetos) baseados na mesma classe.

Ao invs de carregar uma nica instancia de um grupo de funes dentro de uma memria implcita quando um modulo chamado, o programa ABAP pode agora gerar as instancias de classes explicitamente usando o novo comando ABAP CREATE OBJECT. As instancias individuais representam objetos nicos. Voc enderea estes usando referncias a objetos. As referncias aos objetos permitem que o programa ABAP acesse as interfaces das instancias.

ExemploO exemplo a seguir demonstra o aspecto orientado a objeto de grupo de funes no simples caso de um contador.

Suponha que tenhamos um grupo de funo chamado COUNTER: FUNCTION-POOL COUNTER. DATA COUNT TYPE I. FUNCTION SET_COUNTER. * Local Interface IMPORTING VALUE(SET_VALUE) COUNT = SET_VALUE. ENDFUNCTION.

11/70

OOP em ABAPFUNCTION INCREMENT_COUNTER. ADD 1 TO COUNT. ENDFUNCTION. FUNCTION GET_COUNTER. * Local Interface: EXPORTING VALUE(GET_VALUE) GET_VALUE = COUNT. ENDFUNCTION. O grupo de funes tem um campo inteiro global COUNT, e trs mdulos de funes, SET_COUNTER, INCREMENT_COUNTER, e GET_COUNTER, que trabalham com o campo. Dois dos mdulos de funes tm parmetros de sada e de entrada. Estes formam a interface de dados do grupo de funes. Qualquer programa ABAP pode ento trabalhar com este grupo de funes. Exemplo: DATA NUMBER TYPE I VALUE 5. CALL FUNCTION 'SET_COUNTER' EXPORTING SET_VALUE = NUMBER. DO 3 TIMES. CALL FUNCTION 'INCREMENT_COUNTER'. ENDDO. CALL FUNCTION 'GET_COUNTER' IMPORTING GET_VALUE = NUMBER. Aps esta seo do programa tiver sido processada, a varivel do programa NUMBER ter valor 8. O programa por ele prprio no pode acessar o campo COUNT no grupo de funes. Operaes neste campo esto completamente encapsuladas no mdulo de funes. O programa pode apenas comunicar com os grupos de funes chamando os seus mdulos de funo.

Grfico Geral

12/70

OOP em ABAPClasses

A figura a esquerda demonstra as partes de declarao e implementao de uma classe local C1. A figura a direita ilustra a estrutura da classe com os componentes em suas respectivas reas de visibilidade, e a implementao de mtodos. Os componentes pblicos da classe formam a interface entre a classe e seus usurios. Os componentes protegidos so uma interface para que as subclasses de C1 acessem atributos da superclasse. Os componentes privados no esto visveis externamente, e esto completamente encapsulados dentro da classe. Os mtodos ,na parte de implementao, tem acesso irrestrito a todos os componentes da classe.

Classes Exemplo Introdutrio

13/70

OOP em ABAPO simples exemplo a seguir utiliza Objetos ABAP para programar um contador. Para comparao, veja tambm o exemplo em De Grupo de Funes a Objetos:

CLASS C_COUNTER DEFINITION. PUBLIC SECTION. METHODS: SET_COUNTER IMPORTING VALUE(SET_VALUE) TYPE I, INCREMENT_COUNTER, GET_COUNTER EXPORTING VALUE(GET_VALUE) TYPE I. PRIVATE SECTION. DATA COUNT TYPE I. ENDCLASS. CLASS C_COUNTER IMPLEMENTATION. METHOD SET_COUNTER. COUNT = SET_VALUE. ENDMETHOD. METHOD INCREMENT_COUNTER. ADD 1 TO COUNT. ENDMETHOD. METHOD GET_COUNTER. GET_VALUE = COUNT. ENDMETHOD. ENDCLASS. A classe C_COUNTER contm trs mtodos pblicos - SET_COUNTER, INCREMENT_COUNTER, e GET_COUNTER. Cada um destes trabalham com o campo inteiro privado COUNT. Dois dos mtodos tem parmetros de entrada e sada. Estes formam a interface de dados da classe. O campo COUNT no visvel externamente.

Grfico Geral

14/70

OOP em ABAPObjetos como Instancias de uma Classe

A ilustrao acima mostra uma classe C1 a esquerda, com suas instancias representadas na sesso interna de um programa ABAP a direita. Para distingu-los de classes, instancias so desenhadas com cantos redondos. Os nomes das instancias acima usam a mesma notao como usada para variveis de referncia no Debugger.

Objetos Exemplo Introdutrio

O exemplo a seguir demonstra como criar e utilizar uma instancia da classe C_COUNTER que ns criamos no captulo anterior:

Exemplo:

15/70

OOP em ABAP

O comando DATA cria uma varivel CREF1de referncia a classe com tipo C_COUNTER. Esta varivel pode conter referncias a todas as instancias da classe C_COUNTER. A classe C_COUNTER deve ser conhecida ao programa quando o comando DATA ocorre. Voc pode tanto declar-la localmente antes do comando data no mesmo programa, ou globalmente usando o Class Builder(SE24). O contedo de CREF1 so iniciais. A referncia no aponta para uma instancia(Em uma analogia, seria um ponteiro dangling que no possui memria alocada) .

16/70

OOP em ABAP

O comando CREATE OBJECT cria um objeto (instancia) da classe C_COUNTER. A referncia na varivel de referncia CREF1 indica este objeto. A instancia da classe C_COUNTER chamada C_COUNTER,e ela guarda o contedo da varivel de objeto REF_COUNTER_1, mostradas no debugger aps o comando CREATE OBJECT tiver sido executado. Este nome apenas usado para administrao de programas internos no ocorre dentro do prprio programa ABAP.

17/70

OOP em ABAP

O programa ABAP pode acessar os componentes pblicos do objeto usando a varivel de referncia CREF1, isso neste caso, pode chamar os mtodos pblicos da classe C_COUNTER. Aps o programa esquerda tiver sido executado, as variveis do programa NUMBER e o atributo do objeto privado COUNT ambos tero valor 8.

18/70

OOP em ABAP

O programa acima declara trs diferentes variveis de referncia a classes para a classe C_COUNTER. Todas as referncias so iniciais.

19/70

OOP em ABAP

O sistema cria trs objetos da classe de trs variveis de referncias de classes. As referncias nestas trs variveis de referncia apontam para um destes objetos. No gerenciamento interno do programa, as instancias individuais so chamadas C_COUNTER, C_COUNTER, e C_COUNTER. Elas so nomeadas na ordem em que so criadas.

20/70

OOP em ABAP

O programa ABAP pode usar as variveis de referncia para acessar objetos individuais, isto neste caso, para chamar os mtodos pblicos da classe C_COUNTER. Cada objeto tem seu prprio estado, j que o atributo da instancia privada COUNT tem um valor separado para cada objeto. O programa a esquerda administra vrios contadores independentes.

21/70

OOP em ABAP

Aqui, trs variveis de referncia a classes so declaradas para a classe C_COUNTER, e dois objetos so criados para a classe. As referncias nas variveis CREF1 e CREF2 apontam para um destes objetos. A referncia CREF3 inicial.

22/70

OOP em ABAP

Aps o comando MOVE, CREF3 contm as mesmas referncias de CREF2, e ambas indicam o objeto C_COUNTER. Um usurio pode ento usar ambas para indicar o objeto C_CONTER.

23/70

OOP em ABAP

O comando CLEAR desfaz a referncia em CREF2 para seu valor inicial. A varivel de referncia CREF2 ento contm o mesmo valor que continha aps sua declarao, ela no mais indica um objeto.

24/70

OOP em ABAP

O efeito do comando de igualdade copiar a referncia de CREF1 para CREF2. Como resultado, a referncia em CREF3 tambm indica o objeto C_COUNTER. Mais nenhuma referncia indica o objeto C_COUNTER, e este automaticamente excludo pelo coletor de lixo. O nome interno C_COUNTER est agora livre novamente.

Declarando e Chamando MtodosEsta seo explica como trabalhar com mtodos em objetos ABAP. Para detalhes precisos de comandos relevantes ABAP, refira-se a palavra chave na documentao do editor. O exemplo mostra como declarar, implementar e chamar mtodos.

Declarando MtodosVoc pode declarar mtodos na parte de declarao de uma classe ou em uma interface. Para declarar mtodos de instancia (pertencentes ao objeto), use o seguinte comando: METHODS IMPORTING.. [VALUE(][)] TYPE type [OPTIONAL].. EXPORTING.. [VALUE(][)] TYPE type [OPTIONAL].. CHANGING.. [VALUE(][)] TYPE type [OPTIONAL].. RETURNING VALUE() EXCEPTIONS.. .. E as adies apropriadas. Para declarar mtodos estticos(pertencem classe), use o seguinte comando:

25/70

OOP em ABAPCLASS-METHODS ... Ambos tm a mesma sintaxe. Quando voc declara um mtodo, voc tambm define sua interface de parmetros usando as adies IMPORTING, EXPORTING, CHANGING, e RETURNING. As adies definem parmetros de entrada/sada, e o cdigo de retorno. Elas tambm definem os atributos dos parmetros da interface, principalmente quando um parmetro passado por referncia ou valor (VALUE), seu tipo(TYPE), e se opcional (OPTIONAL, DEFAULT). Ao contrrio de mdulos de funes, o modo default de passar um parmetro em um mtodo por referncia. Para passar um parmetro por valor, voc deve explicitamente especificar a adio VALUE. O valor de retorno (RETURNING) deve sempre ser passado explicitamente como um valor. Isto timo para mtodos que retornam um nico valor de sada. Se voc us-lo, voc no pode usar EXPORTING ou CHANGING. Assim como em mdulos de funes, voc pode usar parmetros de excees (EXCEPTIONS) para permitir que o usurio reaja a situaes de erro quando o mtodo executado.

Implementando MtodosVoc deve implementar todos os mtodos dentro de uma classe na parte de implementao. METHOD . ... ENDMETHOD. Quando voc implementa o mtodo, no precisa especificar quaisquer parmetros de interface, j que so definidos dentro da declarao do mtodo. Os parmetros de interface de um mtodo comportam-se como variveis locais dentro do mtodo de implementao. Pode-se definir variveis locais adicionais dentro de um mtodo usando o comando DATA. Assim como mdulos de funes, voc pode usar o comando RAISE e MESSAGE RAISING para lidar com situaes de erro. Quando voc implementa um mtodo esttico, lembre-se que isto pode apenas trabalhar com atributos estticos da sua classe. Mtodos de instancias podem trabalhar com ambos atributos estticos ou de instancia.

Chamando MtodosPara chamar um mtodo, use o seguinte comando: CALL METHOD EXPORTING... =.... IMPORTING... =.... CHANGING ... =.... RECEIVING r=h EXCEPTIONS... = rc i... O modo como se acessa o mtodo depende de onde voc o est chamando. Dentro da parte de implementao da classe, voc pode chamar os mtodos da mesma classe diretamente usando o nome deles. CALL METHOD ... Fora da classe, a visibilidade do mtodo depende da visibilidade atribuda a ele(public). Mtodos de instancia visveis podem ser chamados de fora da classe usando: CALL METHOD ->...

26/70

OOP em ABAPOnde uma varivel de referncia cujo valor indica uma instancia da classe. Mtodos de classe visveis podem ser chamados de fora da classe usando: CALL METHOD =>... onde o nome da classe relevante. Quando voc chama um mtodo, voc deve passar todos os parmetros de entrada obrigatrios usando EXPORTING ou CHANGING no comando CALL METHOD. Voc pode (se quiser) importar os parmetros de sadas para dentro de seu programa usando IMPORTING ou RECEIVING. Igualmente, voc pode (se quiser) manipular quaisquer excees disparadas pelos mtodos usando a adio EXCEPTIONS. No entanto, isto altamente recomendado. Voc passa e recebe valores em mtodos da mesma maneira dos mdulos de funes, incluindo a sintaxe aps a adio correspondente: ... = Os parmetros de interface (Parmetros Formais) esto sempre do lado esquerdo do sinal de igualdade. O novo parmetro est sempre a direita. O sinal de igual no um operador de atribuio neste contexto, ele meramente serve para copiar variveis do programa para os parmetros de interface de mtodo. Se a interface de um mtodo consiste apenas de um simples parmetro IMPORTING, voc pode usar a seguinte forma resumida de chamada de mtodo: CALL METHOD ( f). O parmetro passado para os parmetros de entrada do mtodo. Se a interface de um mtodo consiste apenas de parmetros IMPORTING, voc pode usar a seguinte forma resumida: CALL METHOD (.... =....). Cada actual parameter passado correspondenteis ao formal parameter .

Mtodos de Manipulao de EventosMtodos de manipulao de eventos so mtodos especiais que no podem ser chamados usando o comando CALL METHOD. Eles so ativados usando eventos. Voc define um mtodo como um manipulador de eventos usando a adio ... FOR EVENT OF ... No comando METHODS ou CLASS-METHODS. As seguintes regras especiais se aplicam para a interface de um mtodo manipulador de eventos: A interface pode apenas consistir de parmetros IMPORTING. Cada parmetro IMPORTING deve ser um parmetro EXPORTING no evento . Os atributos dos parmetros so definidos na declarao do evento (comando EVENTS) e so adotados pelo mtodo manipulador de eventos.

27/70

OOP em ABAPConstructorsConstructors so mtodos especiais que no podem ser chamados usando CALL METHOD. Ao invs, eles so chamados automaticamente pelo sistema para selecionar o estado inicial de um novo objeto ou classe. H dois tipos de constructors instance constructors e static constructors. Constructors so mtodos com um nome pr-definido. Para us-los, voc deve explicitamente declar-los dentro da classe. O instance constructor de uma classe o mtodo predefinido de um objeto CONSTRUCTOR. Voc o declara da seguinte maneira na seo publica da classe. METHODS CONSTRUCTOR IMPORTING.. [VALUE(][)] TYPE type [OPTIONAL].. EXCEPTIONS.. . E implementa-lo na seo de implementao como qualquer outro mtodo. O sistema chama o instance constructor uma vez para cada instancia da classe, diretamente aps o objeto ter sido criado no comando CREATE OBJECT. Voc pode passar parmetros de entrada do instance constructor e lidar com excees usando as adies EXPORTING e EXCEPTIONS. O static constructor de uma classe um mtodo esttico com o nome CLASS_CONSTRUCTOR pr-definido. Voc o declara na seo pblica como segue: CLASS-METHODS CLASS_CONSTRUCTOR. E implementa-lo na seo de implementao como qualquer outro mtodo. O static constructor no possui parmetros. O sistema chama o static constructor uma vez para cada classe, antes da classe ser acessada pela primeira vez. O static constructor pode ento acessar componentes de sua prpria classe.

Mtodos em Objetos ABAP - ExemploO exemplo a seguir demonstra como declarar, implementar, e usar mtodos em objetos ABAP.

Viso GeralEste exemplo usa trs classes chamadas C_TEAM, C_BIKER, e C_BICYCLE. Um usurio (um programa) pode criar objetos da classe C_TEAM. Em uma selection screen, a classe C_TEAM pergunta pelo nmero de membros em cada time. Cada objeto na classe C_TEAM pode criar um mximo de instancias igual ao total da classe C_BIKER de membros no time. Cada instancia da classe C_BIKER cria uma instancia da classe C_BICYCLE. Cada instancia da classe C_TEAM pode comunicar com o usurio do programa atravs de uma lista interativa. O usurio do programa pode escolher membros do time individuais para aes. As instancias da classe C_BIKER permite que o usurio escolha a ao em uma selection screen posterior.

28/70

OOP em ABAP

29/70

OOP em ABAPConflitos

Os comandos usados para processamento de listas ainda no esto completamente disponveis com objetos ABAP. No entanto, para produzir um simples teste, voc pode usar o seguinte: o o o o WRITE [AT] /() ULINE SKIP NEW-LINE

Nota: O comportamento da formatao e funes interativas de listagem em seu estado atual no so garantidos. Mudanas incompatveis podem ocorrer em um release futuro.

DeclaraesEste exemplo foi implementado utilizando classes locais, j que selection screens pertencem ao programa ABAP, e no pode ser definido ou chamado em classes globais. Abaixo h definies de duas selection screens e trs classes: ******************************************************************* * Global Selection Screens ******************************************************************* SELECTION-SCREEN BEGIN OF: SCREEN 100 TITLE TIT1, LINE. PARAMETERS MEMBERS TYPE I DEFAULT 10. SELECTION-SCREEN END OF: LINE, SCREEN 100. *-----------------------------------------------------------------SELECTION-SCREEN BEGIN OF SCREEN 200 TITLE TIT2. PARAMETERS: DRIVE RADIOBUTTON GROUP ACTN, STOP RADIOBUTTON GROUP ACTN, GEARUP RADIOBUTTON GROUP ACTN, GEARDOWN RADIOBUTTON GROUP ACTN. SELECTION-SCREEN END OF SCREEN 200. ******************************************************************* * Class Definitions ******************************************************************* CLASS: C_BIKER DEFINITION DEFERRED, C_BICYCLE DEFINITION DEFERRED. *-----------------------------------------------------------------CLASS C_TEAM DEFINITION.

30/70

OOP em ABAPPUBLIC SECTION. TYPES: BIKER_REF TYPE REF TO C_BIKER, BIKER_REF_TAB TYPE STANDARD TABLE OF BIKER_REF WITH DEFAULT KEY, BEGIN OF STATUS_LINE_TYPE, FLAG(1) TYPE C, TEXT1(5) TYPE C, ID TYPE I, TEXT2(7) TYPE C, TEXT3(6) TYPE C, GEAR TYPE I, TEXT4(7) TYPE C, SPEED TYPE I, END OF STATUS_LINE_TYPE. CLASS-METHODS: CLASS_CONSTRUCTOR. METHODS: CONSTRUCTOR, CREATE_TEAM, SELECTION, EXECUTION. PRIVATE SECTION. CLASS-DATA: TEAM_MEMBERS TYPE I, COUNTER TYPE I. DATA: ID TYPE I, STATUS_LINE TYPE STATUS_LINE_TYPE, STATUS_LIST TYPE SORTED TABLE OF STATUS_LINE_TYPE WITH UNIQUE KEY ID, BIKER_TAB TYPE BIKER_REF_TAB, BIKER_SELECTION LIKE BIKER_TAB, BIKER LIKE LINE OF BIKER_TAB. METHODS: WRITE_LIST. ENDCLASS. *-----------------------------------------------------------------CLASS C_BIKER DEFINITION. PUBLIC SECTION. METHODS: CONSTRUCTOR IMPORTING TEAM_ID TYPE I MEMBERS TYPE I, SELECT_ACTION, STATUS_LINE EXPORTING LINE TYPE C_TEAM=>STATUS_LINE_TYPE. PRIVATE SECTION. CLASS-DATA COUNTER TYPE I.

31/70

OOP em ABAPDATA: ID TYPE I, BIKE TYPE REF TO C_BICYCLE, GEAR_STATUS TYPE I VALUE 1, SPEED_STATUS TYPE I VALUE 0. METHODS BIKER_ACTION IMPORTING ACTION TYPE I. ENDCLASS. *-----------------------------------------------------------------CLASS C_BICYCLE DEFINITION. PUBLIC SECTION. METHODS: DRIVE EXPORTING VELOCITY TYPE I, STOP EXPORTING VELOCITY TYPE I, CHANGE_GEAR IMPORTING CHANGE TYPE I RETURNING VALUE(GEAR) TYPE I EXCEPTIONS GEAR_MIN GEAR_MAX. PRIVATE SECTION. DATA: SPEED TYPE I, GEAR TYPE I VALUE 1. CONSTANTS: MAX_GEAR TYPE I VALUE 18, MIN_GEAR TYPE I VALUE 1. ENDCLASS. ******************************************************************* Note que nenhuma das trs classes tem atributos pblicos. Os estados das classes podem ser modificados apenas pelos prprios mtodos. O classe C_TEAM Contm um CLASS_CONSTRUCTOR. C_TEAM e C_BIKER ambos contm instance constructors.

ImplementaesAs sees de implementao contm as implementaes de todos os mtodos declarados nas partes correspondentes de declarao. As interfaces dos mtodos j foram definidas na declarao. Nas implementaes, os parmetros de interface se comportam como dado local.

Mtodos da Classe C_TEAMOs mtodos seguintes so implementados nesta seo: CLASS C_TEAM IMPLEMENTATION. ... ENDCLASS.

32/70

OOP em ABAPCLASS_CONSTRUCTOR METHOD CLASS_CONSTRUCTOR. TIT1 = 'Team members ?'. CALL SELECTION-SCREEN 100 STARTING AT 5 3. IF SY-SUBRC NE 0. LEAVE PROGRAM. ELSE. TEAM_MEMBERS = MEMBERS. ENDIF. ENDMETHOD. O static constructor executado antes da classe C_TEAM ser usada pela primeira vez no programa. Ele chama a selection screen 100 e seleciona o atributo TEAM_MEMBERS para o valor entrado pelo usurio. Este atributo tem o mesmo valor para todas as instancias da classe C_TEAM. CONSTRUCTOR METHOD CONSTRUCTOR. COUNTER = COUNTER + 1. ID = COUNTER. ENDMETHOD. O instance constructor executada diretamente aps cada instancia da classe C_TEAM ser criada. Ela usada para contar o nmero de instancias de C_TEAM no atributo esttico COUNTER, e assimila o nmero correspondente para o atributo ID de cada instancia da classe. CREATE_TEAM METHOD CREATE_TEAM. DO TEAM_MEMBERS TIMES. CREATE OBJECT BIKER EXPORTING TEAM_ID = ID MEMBERS = TEAM_MEMBERS. APPEND BIKER TO BIKER_TAB. CALL METHOD BIKER->STATUS_LINE IMPORTING LINE = STATUS_LINE. APPEND STATUS_LINE TO STATUS_LIST. ENDDO. ENDMETHOD. O mtodo pblico de instancia CREATE_TEAM pode ser chamado por qualquer usurio da classe contendo uma varivel com uma referncia para a instancia da classe. usada para criar instancias da classe C_BIKER, usando a varivel referencial privada BIKER na classe C_TEAM. Voc deve passar ambos parmetros de entrada para o instance constructor da classe C_BIKER no comando CREATE OBJECT. As referncias para as novas instancias so inseridas dentro de uma tabela interna privada BIKER_TAB. Aps o mtodo tiver sido executado, cada linha da tabela interna contm uma referncia para uma instancia da classe C_BIKER. Estas referncias so apenas visveis dentro da classe C_TEAM. Usurios externos no podem enderear os objetos da classe C_BIKER. CREATE_TEAM tambm chama o mtodo STATUS_LINE para cada objeto novo, e usa a work area STATUS_LINE para acrescentar o parmetro de sada LINE tabela interna privada STATUS_LIST. SELECTION

33/70

OOP em ABAPMETHOD SELECTION. CLEAR BIKER_SELECTION. DO. READ LINE SY-INDEX. IF SY-SUBRC 0. EXIT. ENDIF. IF SY-LISEL+0(1) = 'X'. READ TABLE BIKER_TAB INTO BIKER INDEX SY-INDEX. APPEND BIKER TO BIKER_SELECTION. ENDIF. ENDDO. CALL METHOD WRITE_LIST. ENDMETHOD. O mtodo de instancia pblica SELECTION pode ser chamado por qualquer usurio da classe contendo uma varivel referencial com referncia a uma instancia de uma classe. Ela seleciona todas as linhas na lista atual em quais a caixa de verificao na primeira coluna selecionada. Para estas linhas, o sistema copia as variveis referenciais correspondentes da tabela BIKER_TAB dentro de uma tabela interna BIKER_SELECTION. SELECTION ento chama o mtodo privado WRITE_LIST, que mostra a lista. EXECUTION METHOD EXECUTION. CHECK NOT BIKER_SELECTION IS INITIAL. LOOP AT BIKER_SELECTION INTO BIKER. CALL METHOD BIKER->SELECT_ACTION. CALL METHOD BIKER->STATUS_LINE IMPORTING LINE = STATUS_LINE. MODIFY TABLE STATUS_LIST FROM STATUS_LINE. ENDLOOP. CALL METHOD WRITE_LIST. ENDMETHOD. O mtodo de instancia pblica EXECUTION pode ser chamado por qualquer usurio da classe. O mtodo chama dois mtodos SELECT_ACTION e STATUS_LINE para cada instancia da classe C_BIKER para qual h uma referncia na tabela BIKER_SELECTION. A linha da tabela STATUS_LIST com a mesma chave do componente ID na work area STATUS_LINE sobrescrita e mostrada pelo mtodo privado WRITE_LIST.

WRITE_LIST METHOD WRITE_LIST. SET TITLEBAR 'TIT'. SY-LSIND = 0. SKIP TO LINE 1. POSITION 1. LOOP AT STATUS_LIST INTO STATUS_LINE. WRITE: / STATUS_LINE-FLAG AS CHECKBOX, STATUS_LINE-TEXT1, STATUS_LINE-ID, STATUS_LINE-TEXT2, STATUS_LINE-TEXT3, STATUS_LINE-GEAR, STATUS_LINE-TEXT4, STATUS_LINE-SPEED.

34/70

OOP em ABAPENDLOOP. ENDMETHOD. O mtodo privado de instancia WRITE_LIST pode apenas ser chamado de mtodos da classe C_TEAM. usada para mostrar a tabela interna privada STATUS_LIST na lista bsica (SY-LSIND = 0) do programa.

Mtodos da Classe C_BIKEROs mtodos seguintes so implementados na seo: CLASS C_BIKER IMPLEMENTATION. ... ENDCLASS. CONSTRUCTOR METHOD CONSTRUCTOR. COUNTER = COUNTER + 1. ID = COUNTER - MEMBERS * ( TEAM_ID - 1). CREATE OBJECT BIKE. ENDMETHOD. O instance constructor executado diretamente aps cada instance da classe C_BIKER ser criada. usada para contra o nmero de instance de C_BIKER no atributo esttico COUNTER, e define os nmeros correspondents para o atributo de instance ID de cada instance da classe. O constructor tem dois parmetros de entrada TEAM_ID e MEMBERS os quais voc deve passar no comando CREATE OBJECT quando voc cria uma instance em C_BIKER. O instance constructor tambm cria uma instance da classe C_BICYCLE para cada nova instance da classe C_BIKER. A referncia na varivel referencial privada BIKE de cada instance de C_BIKER indica para uma instance correspondente da classe C_BICYCLE. Nenhum usurio externo pode enderear estas instances da classe C_BICYCLE.

SELECT_ACTION METHOD SELECT_ACTION. DATA ACTIVITY TYPE I. TIT2 = 'Select action for BIKE'. TIT2+24(3) = ID. CALL SELECTION-SCREEN 200 STARTING AT 5 15. CHECK NOT SY-SUBRC GT 0. IF GEARUP = 'X' OR GEARDOWN = 'X'. IF GEARUP = 'X'. ACTIVITY = 1. ELSEIF GEARDOWN = 'X'. ACTIVITY = -1. ENDIF. ELSEIF DRIVE = 'X'. ACTIVITY = 2. ELSEIF STOP = 'X'. ACTIVITY = 3. ENDIF.

35/70

OOP em ABAPCALL METHOD BIKER_ACTION( ACTIVITY). ENDMETHOD. O mtodo da instancia pblico SELECT_ACTION pode ser chamado por qualquer usurio da classe contendo uma varivel referencial com uma referncia para uma instancia da classe. O mtodo chama a selection screen 200 e analisa a entrada do usurio. Depois disto, chama o mtodo privado BIKER_ACTION da mesma classe. A chamada do mtodo usa a forma reduzida para passar o parmetro atual ACTIVITY para parmetro formal ACTION. BIKER_ACTION METHOD BIKER_ACTION. CASE ACTION. WHEN -1 OR 1. CALL METHOD BIKE->CHANGE_GEAR EXPORTING CHANGE = ACTION RECEIVING GEAR = GEAR_STATUS EXCEPTIONS GEAR_MAX = 1 GEAR_MIN = 2. CASE SY-SUBRC. WHEN 1. MESSAGE I315(AT) WITH 'BIKE' ID ' is already at maximal gear!'. WHEN 2. MESSAGE I315(AT) WITH 'BIKE' ID ' is already at minimal gear!'. ENDCASE. WHEN 2. CALL METHOD BIKE->DRIVE IMPORTING VELOCITY = SPEED_STATUS. WHEN 3. CALL METHOD BIKE->STOP IMPORTING VELOCITY = SPEED_STATUS. ENDCASE. ENDMETHOD. O mtodo de instancia privado BIKER_ACTION pode ser apenas chamado dos mtodos da classe C_BICYCLE para qual a referncia na varivel referencial BIKE est indicando, dependendo do valor na entrada do parmetro ACTION. STATUS_LINE METHOD STATUS_LINE. LINE-FLAG = SPACE. LINE-TEXT1 = 'Biker'. LINE-ID = ID. LINE-TEXT2 = 'Status:'. LINE-TEXT3 = 'Gear = '. LINE-GEAR = GEAR_STATUS. LINE-TEXT4 = 'Speed = '. LINE-SPEED = SPEED_STATUS. ENDMETHOD. O mtodo da instancia pblica STATUS_LINE pode ser chamado por qualquer usurio da classe. Isto atribui ao parmetro estruturado de sada LINE com os valores de atributos atuais da instancia correspondente.

Mtodos da Classe C_BICYCLE

36/70

OOP em ABAPOs mtodos seguintes so implementados na seo: CLASS C_BICYCLE IMPLEMENTATION. ... ENDCLASS. DRIVE METHOD DRIVE. SPEED = SPEED + GEAR * 10. VELOCITY = SPEED. ENDMETHOD. O mtodo da instancia pblica DRIVE pode ser chamado por qualquer usurio da classe. O mtodo muda os valores do atributo privado SPEED e passa-o para o usurio usando o parmetro de sada VELOCITY. STOP METHOD STOP. SPEED = 0. VELOCITY = SPEED. ENDMETHOD. O mtodo da instancia pblica STOP pode ser chamado por qualquer usurio da.O mtodo muda os valores do atributo privado SPEED e passa-o para o usurio o parmetro de sada VELOCITY.

CHANGE_GEAR METHOD CHANGE_GEAR. GEAR = ME->GEAR. GEAR = GEAR + CHANGE. IF GEAR GT MAX_GEAR. GEAR = MAX_GEAR. RAISE GEAR_MAX. ELSEIF GEAR LT MIN_GEAR. GEAR = MIN_GEAR. RAISE GEAR_MIN. ENDIF. ME->GEAR = GEAR. ENDMETHOD. O mtodo da instancia pblica CHANGE_GEAR pode ser chamado por qualquer usurio da classe. O mtodo muda o valor do atributo privado GEAR. J que o parmetro formal com o mesmo nome obscurece o atributo dentro do mtodo, o atributo tem de ser endereado usando a referncia prpria ME->GEAR (ME referencia a instncia que chamou o mtodo).

Usando as Classes dentro de um Programa

37/70

OOP em ABAPO programa a seguir mostra como as classes acima podem ser usadas em um programa. As declaraes da selection screen e classes locais, e as implementaes dos mtodos tambm devem ser parte do programa. REPORT OO_METHODS_DEMO NO STANDARD PAGE HEADING. ******************************************************************* * Declarations and Implementations ******************************************************************* ... ******************************************************************* * Global Program Data ******************************************************************* TYPES TEAM TYPE REF TO C_TEAM. DATA: TEAM_BLUE TYPE TEAM, TEAM_GREEN TYPE TEAM, TEAM_RED TYPE TEAM. DATA COLOR(5).

******************************************************************* * Program events ******************************************************************* START-OF-SELECTION. CREATE OBJECT: TEAM_BLUE, TEAM_GREEN, TEAM_RED. CALL METHOD: TEAM_BLUE->CREATE_TEAM, TEAM_GREEN->CREATE_TEAM, TEAM_RED->CREATE_TEAM. SET PF-STATUS 'TEAMLIST'. WRITE ' Select a team! ' COLOR = 2.

*-----------------------------------------------------------------AT USER-COMMAND. CASE SY-UCOMM. WHEN 'TEAM_BLUE'. COLOR = 'BLUE '. FORMAT COLOR = 1 INTENSIFIED ON INVERSE ON. CALL METHOD TEAM_BLUE->SELECTION. WHEN 'TEAM_GREEN'. COLOR = 'GREEN'. FORMAT COLOR = 5 INTENSIFIED ON INVERSE ON. CALL METHOD TEAM_GREEN->SELECTION. WHEN 'TEAM_RED'. COLOR = 'RED '. FORMAT COLOR = 6 INTENSIFIED ON INVERSE ON.

38/70

OOP em ABAPCALL METHOD TEAM_RED->SELECTION. WHEN 'EXECUTION'. CASE COLOR. WHEN 'BLUE '. FORMAT COLOR = 1 INTENSIFIED ON INVERSE ON. CALL METHOD TEAM_BLUE->SELECTION. CALL METHOD TEAM_BLUE->EXECUTION. WHEN 'GREEN'. FORMAT COLOR = 5 INTENSIFIED ON INVERSE ON. CALL METHOD TEAM_GREEN->SELECTION. CALL METHOD TEAM_GREEN->EXECUTION. WHEN 'RED '. FORMAT COLOR = 6 INTENSIFIED ON INVERSE ON. CALL METHOD TEAM_RED->SELECTION. CALL METHOD TEAM_RED->EXECUTION. ENDCASE. ENDCASE. *******************************************************************

O programa contm trs variveis referenciais a classes que se referem a classe C_TEAM. Ele cria 3 instancias para as variveis de refercia e cada objeto, chama-se o mtodo CREATE_TEAM. O mtodo CLASS_CONSTRUCTOR da classe C_TEAM executado antes da criao do primeiro objeto. O status TEAMLIST para a lista bsica permite que o usurio escolha uma de quatro funes:

Quando o usurio escolhe uma funo, o evento AT USER-COMMAND ativado e os mtodos pblicos so chamados em uma das trs instancias de C_TEAM, dependendo da escolha do usurio. O usurio pode mudar o estado objeto selecionando a linha correspondente na lista de status.

HeranaA herana permite que voc derive uma nova classe de uma j existente. Voc faz isso usando a adio INHERITING FROM do modo a seguir: CLASS DEFINITION INHERITING FROM .

39/70

OOP em ABAPA nova classe herda todos os componentes da classe existente . A nova classe chamada derivada da qual ela herdou. E a original chamada superclasse da nova classe. Se voc adicionar novas declaraes subclasse ela conter os mesmos componentes da superclasse, mais as adies. No entanto, apenas os componentes pblicos e protegidos da superclasse esto visveis na subclasse. Apesar dos componentes privados da superclasse existirem na subclasse, eles no esto visveis. Voc pode declarar componentes privados em uma subclasse que tem os mesmo nomes dos componentes privados da superclasse. Cada classe trabalha com seus prprios componentes privados. Se a superclasse no tem uma seo de visibilidade privada, a subclasse uma rplica exata da superclasse. No entanto, voc pode adicionar novos componentes subclasse. Isto lhe permite que torne uma subclasse em uma verso especializada da superclasse. Se uma subclasse tambm uma superclasse, voc introduz um novo nvel de especializao. Uma classe pode ter mais do que uma subclasse direta, mas apenas uma superclasse direta. Isto chamada herana simples. Quando subclasses herdam de superclasses e a superclasse tambm uma subclasse de outra classe, todas as classes envolvidas formam uma rvore de herana, cujos degraus de especializao aumentam com cada novo nvel hierrquico que voc adicionar. Ao contrrio, as classes se tornam mais generalizadas at se chegar a raiz da rvore de herana. A raiz de todas as rvores de herana em Objetos ABAP a predefinida classe vazia OBJECT. Esta a classe mais generalizada possvel, j que no contm mtodos nem atributos. Quando voc define uma classe, voc no precisa especificar explicitamente a superclasse a relao sempre definida implicitamente. Dentro de uma rvore de herana, dois ns adjacentes so a superclasse direta ou subclasse direta uma da outra. Outros ns relacionados so referidos como superclasse ou subclasse. A declarao de componentes de uma subclasse so distribudas atravs todos os nveis da rvore de herana.

Redefinindo MtodosTodas as subclasses contm componentes de todas as classes entre elas e o n-raiz em uma rvore de herana. A visibilidade de um componente no pode ser mudada. No entanto, voc pode usar a adio REDEFINITION no comando METHODS para redefinir mtodo de instancia pblico ou protegido em uma subclasse e faz-la mais especializada. Quando se redefine um mtodo, voc no pode mudar sua interface. O mtodo continua com o mesmo nome e interface, mas possui uma nova implementao. A declarao e implementao do mtodo na superclasse no so afetadas quando voc redefine o mtodo dentro de uma subclasse. A implementao da redefinio na subclasse obscurece a implementao original na superclasse. Qualquer referncia que indique para um objeto da subclasse usa o mtodo redefinido, at mesmo se a referncia foi definida com referncia a superclasse. Isto particularmente se aplica a autoreferncia ME->. Se, por exemplo, um mtodo de superclasse M1 contm uma chamada CALL METHOD [ME->]M2, e M2 redefinido em uma subclasse, chamando M1 de uma instancia da subclasse que vai fazer com que o mtodo M2 original seja chamado, e chamando M1 de uma instancia da subclasse vai fazer com que o mtodo M2 redefinido seja chamado. Dentro de um mtodo redefinido, voc pode usar a pseudo-referncia SUPER-> para acessar o mtodo obscuro. Isto lhe permite usar a funo existente do mtodo dentro da superclasse sem ter de recodific-lo na subclasse.

Mtodos e Classes Abstratos e FinaisAs adies ABSTRACT e FINAL nos comandos METHODS e CLASS permitem que voc defina mtodos e classes abstratos e finais.

40/70

OOP em ABAPUm mtodo abstrato definido dentro de uma classe abstrata e no pode ser implementado naquela classe. Ao invs, implementada em uma subclasse da classe. Classes abstratas no podem ser instanciadas. Um mtodo final no pode ser redefinido em uma subclasse. Classes finais no podem ter subclasses. Eles concluem uma rvore de herana.

Referncias a Subclasses e PolimorfismoVariveis referenciais definidas como referncia para uma superclasse ou uma interface definida com referncia para ela tambm contm referncias para qualquer uma de suas subclasses. J que as subclasses contm todos os componentes de todas as suas superclasses, e dado que a interface dos mtodos no pode ser mudada, uma varivel referencial definida com referncia a uma superclasse ou uma interface implementada por uma superclasse pode conter referncias para instancias de qualquer de suas subclasses. Em particular, voc pode definir o varivel alvo com referncia a classe genrica OBJECT. Quando voc cria um objeto usando o comando CREATE OBJECT e uma varivel referencial preenchida com referncia a uma subclasse, voc pode usar a adio TYPE para criar uma instancia de subclasse, para qual a referncia na varivel referencial ir indicar. Um usurio esttico pode usar uma varivel referencial para enderear os componentes visveis a ela na superclasse para qual a varivel referencial indica. No entanto, no pode acessar qualquer especializao na subclasse. Se voc usar um mtodo de chamada dinmico, voc pode enderear todos os componentes da classe. Se voc redefinir um mtodo de instancia em um ou mais subclasses, voc pode usar uma nica varivel referencial para chamar diferentes implementaes do mtodo, dependendo da posio na rvore de herana na qual o objeto referido ocorre. Este conceito que diferentes classes podem ter a mesma interface e, portanto serem endereados usando variveis referenciais com um simples tipo chamado polimorfismo.

Espao de Nomes para ComponentesAs subclasses contm todos os componentes de todas as superclasses dentro da rvore de herana acima. Destes componentes, apenas os pblicos e protegidos so visveis. Todos os componentes pblicos e protegidos dentro de uma rvore de herana pertencem ao mesmo espao de nomes, e conseqentemente devem possuir nomes nicos. O nome dos componentes privados, por outro lado, devem apenas ser nicos dentro de sua classe. Quando voc redefine mtodos, a nova implementao dos mtodos obscurece o mtodo da superclasse com o mesmo nome. No entanto, a nova definio substitui o mtodo anterior de implementao, ento o nome ainda nico. Voc pode usar pseudo-referncia SUPER-> para acessar uma definio de mtodos dentro de uma superclasse que tenha sido obscura por uma redefinio de uma subclasse.

Herana e Atributos EstticosComo todos componentes, atributos estticos apenas existem uma vez na rvore de herana. Uma subclasse pode acessar os atributos estticos e protegidos de todas as suas superclasses. Ao contrrio, uma superclasse compartilha os atributos estticos protegidos e pblicos com todas as suas subclasses. Em termos de herana, atributos estticos no so atribudos para uma nica classe, mas a uma parte da rvore de herana. Voc pode mud-las de for a da classe usando o seletor de componentes de classes com qualquer nome de classe, ou dentro de qualquer classe em que ela sejam compartilhadas. Elas so visveis em todas as classes na rvore de herana. Quando se acessa um atributo esttico, sempre se enderea a classe cujo atributo declarado. Isto particularmente importante quando voc chama o static constructor de classes em herana. Static constructors so executados na primeira vez em que a classe acessada. Se voc acessar

41/70

OOP em ABAPum atributo esttico declarado em uma superclasse usando o nome da classe de uma subclasse, apenas o static constructor executado.

Herana e ConstructorsH regras especiais gerenciando constructors em herana.

Instance ConstructorsToda classe tem um instance constructor chamado CONSTRUCTOR. Esta uma exceo a regra de que nomes de componentes dentro de uma rvore de herana devem ser nicos. No entanto, os instance constructors de vrias classes dentro de uma rvore de herana so totalmente independentes um do outros. Voc no pode redefinir o instance constructor de uma superclasse dentro de uma subclasse, nem chamar um especificamente usando o comando CALL METHOD CONSTRUCTOR. Conseqentemente, conflitos de nomes no podem ocorrer. O instance constructor de uma classe chamado pelo sistema quando se cria uma instancia de classe usando CREATE OBJECT. J que uma subclasse contm todos os atributos visveis de suas superclasses, que so tambm preparadas pelos instance contructors de todas as suas superclasses, tais mtodos tambm devem ser chamados. Para fazer isso, o instance constructor de cada subclasse deve conter um comando CALL METHOD SUPER->CONSTRUCTOR. As nicas excees a essa regra so subclasses diretas do n-raiz OBJECT. Em superclasses sem um instance constructor explicitamente definido, o instance constructor implcito chamado. Isto automaticamente garante que o instance constructor da superclasse imediata chamada. Quando voc chama um instance constructor, voc deve passar valores para todos os parmetros de interface obrigatrios. H varias maneiras de fazer isto: Usando CREATE OBJECT Se a classe que voc est criando uma instancia tem um instance constructor com uma interface, deve-se passar valores para ela usando EXPORTING. Se a classe que voc est criando uma instancia tem um instance constructor sem uma interface, no se deve passar parmetros. Se a classe que voc est criando uma instancia no possui um instance constructor explcito, voc deve olhar na rvore de herana pela prxima superclasse que possua um instance constructor explcito. Caso haja uma interface, voc deve passar valores usando EXPORTING, seno no h necessidade de passar qualquer valor. Usando CALL METHOD SUPER->CONSTRUCTOR Se a superclasse direta tem um instance constructor com uma interface, voc deve passar valores para ela usando EXPORTING. Se a superclasse direta tem um instance constructor sem uma interface, no se passam parmetros. Se a superclasse direta no tem um instance constructor explcito, voc deve olhar na rvore de herana pela prxima superclasse com um instance constructor explcito. Se possuir uma interface, voc deve passar valores usando EXPORTING. Seno, no se deve passar quaisquer valores.

42/70

OOP em ABAPEm ambos CREATE OBJECT e CALL METHOD SUPER->CONSTRUCTOR, voc deve olhar ao prximo instance constructor explcito disponvel e, se tiver uma interface, passar valores para ele. O mesmo se aplica para manipulao de excees para instance constructors. Quando se trabalha com herana, necessrio um conhecimento preciso de toda a rvore de herana. Quando voc cria uma instancia para uma classe no nvel inferior da rvore de herana, voc pode precisar passar parmetros para o constructor de uma classe que esteja mais prxima do n-raiz. O instance constructor de uma subclasse dividido em duas partes pelo comando CALL METHOD SUPER->CONSTRUCTOR. Nas linhas antes da chamada, o construtor se comporta como um mtodo esttico, isto , no pode acessar os atributos de instancia da sua classe. Voc no pode acessar atributos de instancia at depois da chamada. Use os comandos antes da chamada para determinar os parmetros atuais para a interface do instance constructor da superclasse. Voc pode apenas usar atributos estticos ou dados locais para fazer isto. Quando voc cria uma instancia de uma subclasse, o instance constructor chamado hierarquicamente. O primeiro nvel em qual voc pode acessar atributos de instancia o nvel mais alto superclasse. Quando voc retorna ao constructor da classe com nvel mais baixo, voc pode tambm sucessivamente acessar seus atributos de instancia. Em um mtodo constructor, os mtodos das subclasses da classe no so visveis. Se um instance constructor chama um mtodo de instancia da mesma classe usando a auto-referncia implcita ME->, o mtodo chamado como se fosse implementado na classe do instance constructor, e no em qualquer forma redefinida que pode ocorrer na subclasse que voc que criar uma instance. Esta uma exceo regra que determina que quando voc chamar mtodos de instances, o sistema sempre chama o mtodo como se tivesse sido implementado na classe cuja instance a referncia est indicando.

Static Constructors

Toda classe tem um static constructor chamado CLASS_CONSTRUCTOR. Assim como o espao para nomes dentro de uma rvore hierrquica, as mesmas regras de um instance constructor se aplicam a um static constructor. A primeira vez que voc acessa uma subclasse em um programa, o static constructor executado. No entanto, antes que possa ser executado, os statics constructors de todas as superclasses devem j ter sido executados. Um static constructor pode apenas ser chamado uma vez por programa. Portanto, quando voc acessa uma subclasse, o sistema procura pela superclasse mais prxima cujo static constructor ainda no foi executado, seguido de todas as classes entre aquela e a subclasse que voc acessou.

43/70

OOP em ABAP Grfico Geral de HeranaHerana: Viso Geral

A parte esquerda do grfico demonstra como voc pode derivar uma subclasse c2 de uma superclasse c1 usando a adio INHERTING FROM no comando CLASS. A parte direita do grfico demonstra como a distribuio da subclasse dentro da rvore de herana, que alcana a classe vazia default OBJECT. Uma subclasse contm todos os componentes declarados acima dela na rvore de herana, e pode acessar aqueles que so declarados pblicos ou protegidos.

44/70

OOP em ABAPHerana Simples

Este grfico ilustra herana simples. Uma classe pode apenas ter uma superclasse direta, mas pode ter mais do que uma subclasse direta. A classe vazia OBJECT o n-raiz de toda rvore de herana em objetos ABAP.

45/70

OOP em ABAPHerana e Variveis Referenciais

Este grfico demonstra como variveis referenciais definidas com referncia para uma superclasse pode indicar objetos de subclasses. O objeto a direita uma instancia da classe class3. As variveis referenciais de classe CREF1, CREF2, e CREF3 so digitadas com referncia a class1, class2, e class3. Todas as trs variveis referenciam ao objeto. No entanto, CREF1 pode apenas acessar os componentes pblicos da classe class1, CREF2 pode acessar os componentes pblicos da class1 e class2. CREF3 pode acessar os componentes pblicos de todas as classes. Se voc redefinir um mtodo de uma superclasse em uma subclasse, voc pode usar uma varivel referencial definida com referncia a superclasse para acessar objetos com diferentes implementaes de mtodos. Quando se acessa a superclasse, o mtodo tem a implementao original, mas quando voc acessa a subclasse, o mtodo tem a nova implementao. O uso de uma simples varivel de referncia para chamar mtodos com mesmo nome que se comportam diferentemente chamado polimorfismo. O tipo esttico sempre uma superclasse. O tipo dinmico(tipo da instncia) pode ser o da superclasse ou subclasse. CLASS counter DEFINITION. PUBLIC SECTION. METHODS: set IMPORTING value(set_value) TYPE i, increment, get EXPORTING value(get_value) TYPE i. PROTECTED SECTION . DATA count TYPE i. ENDCLASS. CLASS counter IMPLEMENTATION. METHOD set. count = set_value. ENDMETHOD. METHOD increment. ADD 1 TO count. ENDMETHOD. METHOD get. get_value = count. ENDMETHOD. ENDCLASS.

46/70

OOP em ABAPCLASS counter_ten DEFINITION INHERITING FROM counter. PUBLIC SECTION. METHODS increment REDEFINITION . DATA count_ten. ENDCLASS. CLASS counter_ten IMPLEMENTATION. METHOD increment. DATA modulo TYPE I. CALL METHOD super->increment . write / count. modulo = count mod 10. IF modulo = 0. count_ten = count_ten + 1. write count_ten. ENDIF. ENDMETHOD. ENDCLASS. DATA: count TYPE REF TO counter, number TYPE i VALUE 5. START-OF-SELECTION. CREATE OBJECT count TYPE counter_ten . CALL METHOD count->set EXPORTING set_value = number. DO 20 TIMES. CALL METHOD count->increment. ENDDO. A classe COUNTER_TEN derivada de COUNTER. Ela redefine o mtodo INCREMENT. Para fazer isto, deve-se modificar a visibilidade do atributo COUNT de privado para protegido. O mtodo redefinido chama o mtodo obscuro da superclasse usando a pseudo-referncia SUPER->. O mtodo redefinido uma especializao do mtodo herdado. O exemplo cria uma instancia da subclasse. A varivel referencial indicando para ela tem o tipo da superclasse (tipo esttico). Quando o mtodo INCREMENT chamado usando a referncia superclasse, o sistema executa o mtodo redefinido da subclasse.

InterfacesClasses, suas instancias (objetos), e acesso a objetos usando variveis referenciais formam o bsico de objetos ABAP. Estes meios j lhe permitem modelar aplicaes tpicas de negcios, como consumidores, ordens, ordens de itens, entre outros, usando objetos, e para implementar solues usando objetos ABAP.

47/70

OOP em ABAPNo entanto, freqentemente necessrio para classes similares fornecer funes similares que so codificadas diferentemente em cada classe, mas que deveria fornecer um ponto uniforme de contato com o usurio. Por exemplo, voc pode ter duas classes similares, conta poupana e contas corrente, ambas as quais tem um mtodo de calcular juros ao ano. As interfaces e nomes dos mtodos so os mesmos, mas a verdadeira implementao diferente. O usurio das classes e suas instancias devem tambm estar aptos a executar o mtodo de final de ano para todas as contas, sem ter de se preocupar individualmente com cada tipo de conta. Objetos ABAP permitem isto atravs do uso de interfaces. Interfaces so estruturas independentes que voc pode implementar em uma classe para ampliar o corpo da classe. O corpo especfico de uma classe definido por seus componentes e sees de visibilidade. Por exemplo, os componentes pblicos de uma classe definem o seu corpo pblico, j que todos os seus atributos podem ser endereados por todos os usurios. Os componentes protegidos de uma classe definem seu corpo em conjunto com suas subclasses.(No entanto, herana no suportada no Release 4.5B). Interfaces ampliam o corpo de uma classe adicionando seus prprios componentes a seo pblica. Isto permite que usurios enderecem diferentes classes via um ponto universal de contato. Interfaces, junto com herana, fornece um dos pilares do polimorfismo, j que eles permitem um mtodo simples dentro de uma interface se comporte diferentemente em diferentes classes.

Definindo InterfacesComo classes, voc pode definir interfaces tanto globalmente no R/3 Repository ou localmente em um programa ABAP. Para informaes sobre como definir interfaces locais leia a seo Class Builder na documentao de ferramentas do ABAP Workbench. A definio de uma interface local includa nos comandos: INTERFACE . ... ENDINTERFACE. A definio contm a declarao para todos os componentes (atributos, mtodos, eventos) da interface. Voc pode definir os mesmos componentes em uma interface assim como em uma classe. Os componentes de interfaces no tm de ser atribudos individualmente para uma seo de visibilidade, j que eles automaticamente pertencem a seo pblica da classe em qual a interface implementada. Interfaces no possuem uma parte de implementao, j que seus mtodos so implementados dentro da classe que implementa a interface.

Implementando InterfacesAo contrrio de classes, interfaces no possuem instancias. Ao invs, interfaces so implementadas por classes. Para implementar uma interface dentro de uma classe, use o comando: INTERFACES . Na parte de declaraes da classe. Este comando pode apenas aparecer na seo pblica da classe. Quando voc implementa uma interface dentro de uma classe, os componentes da interface so adicionados aos outros componentes na seo pblica. Um componente de uma interface pode ser acessada como se fosse uma membro da classe sob o nome .

48/70

OOP em ABAPA classe deve implementar os mtodos de todas as interfaces implementadas nela. A parte de implementao da classe deve conter um mtodo de implementao para cada mtodo de interface : METHOD . ... ENDMETHOD. Interfaces podem ser implementadas por diferentes classes. Cada uma destas classes ampliada pelo mesmo conjunto de componentes. No entanto, os mtodos da interface podem ser implementados diferentemente dentro de cada classe. Interfaces permitem que voc use diferentes classes em um modo uniforme usando referncias de interface (polimorfismo). Por exemplo, interfaces que so implementadas em diferentes classes e ampliam o corpo pblico de cada classe em um mesmo conjunto de componentes. Se uma classe no tem nenhum componente pblico especfico dela, as interfaces definem todo o corpo pblico da classe.

Referncia de InterfaceVariveis referenciais lhe permitem acessar objetos. Ao invs de criar variveis referenciais com referncia a uma classe, voc pode tambm defin-los com referncia a uma interface. Este tipo de varivel referencial pode conter referncias a objetos de classes que implementam a interface correspondente. Para definir uma referncia de interface, use a adio TYPE REF TO no comando TYPES ou DATA. deve ser uma interface que foi declarada ao programa antes da verdadeira declarao da referncia ocorrer. Uma varivel referencial com a referncia de interface type chamada uma varivel referencial de interface ou referncia de interface. Uma referncia de interface permite que um usurio utilize a forma -> para enderear todos os componentes visveis da interface do objeto cujo objeto de referncia est indicando. Isso permite que o usurio acesse todos os componentes do objeto que foram adicionados a sua definio pela implementao da interface.

Endereando Objetos Usando Referncias de InterfacesPara criar um objeto da classe , voc deve primeiro ter declarado uma varivel referencial com referncia classe. Se a classe implementa uma interface , voc pode usar a seguinte atribuio entre a varivel referencial da classe e uma referncia de interface para fazer com que a referncia de interface em indique o mesmo objeto da referncia de classe : = Se a interface contm um atributo de instancia e um mtodo de instancia , voc pode acessar os componentes da interface como a seguir: Usando a varivel referencial de classe : Para acessar um atributo : -> Para chamar um mtodo : CALL METHOD ->

Usando a varivel referencial de interface :

49/70

OOP em ABAP Para acessar um atributo : < iref>-> Para chamar um mtodo : CALL METHOD ->

Em relao a componentes estticos de interfaces, voc pode apenas utilizar o nome da interface para acessar constantes: Acessando uma constante : < intf>=> Para todos os outros componentes estticos de uma interface, voc pode apenas usar referncias a objetos ou a classe que implementa a interface. Endereando um atributo esttico : < class>=> Chamando um mtodo esttico : CALL METHOD =>

Atribuio Usando Referncias de InterfacesAssim como referncias de classes, voc pode atribuir referncias de interfaces para diferentes variveis referenciais. Voc pode tambm fazer atribuies entre variveis referenciais de classes e variveis referenciais de interfaces. Quando voc usa o comando MOVE ou o operador de atribuio (=) para atribuir variveis referenciais, o sistema deve estar apto a reconhecer na verificao de sintaxe se a atribuio possvel. Suponha que tenhamos uma referncia de classe e referncias de interfaces , , e . As seguintes atribuies com referncias de interfaces podem ser checadas estaticamente: = Ambas referncias de interfaces devem indicar mesma interface, ou a interface de deve conter a interface como um componente. = A classe da referncia de classe deve implementar a interface da referncia de interface . = A classe de deve ser predefinida como a classe vazia OBJECT. Em todos os outros casos, voc teria que trabalhar com o comando MOVE ?-TO ou o casting operator (?=). O casting operator substitui o operador de atribuio (=). No comando MOVE?TO, ou quando voc utiliza o casting operator, no h verificao de tipo esttico. Ao invs, o sistema verifica em tempo de execuo se a referncia do objeto na varivel de origem indica um objeto cuja referncia de objeto no alvo a varivel tambm pode indicar. Se a atribuio possvel, o sistema a faz, seno, o erro em tempo de execuo MOVE_CAST_ERROR ocorre. Voc deve sempre usar casting para atribuir uma referncia de interface a uma referncia de classe se no indica a classe predefinida vazia OBJECT: ?= para o type cast ter sucesso, o objeto o qual indica deve ser um objeto da mesma classe como o tipo da varivel de classe .

50/70

OOP em ABAP

Grficos GeraisInterfaces

A figura esquerda do diagrama demonstra a definio de uma interface local I1 e as partes da declarao e implementao da classe local C1 que implementa a interface I1 em sua seo pblica. O mtodo de interface I1~M1 implementado na classe. Voc no pode implementar interfaces em outras sees de visibilidade. A figura direita ilustra a estrutura da classe com os componentes em suas respectivas reas de visibilidade, e a implementao dos mtodos. Os componentes da interface ampliam o corpo pblico da classe. Todos os usurios podem acessar os componentes pblicos especficos da classe e os componentes da interface.

51/70

OOP em ABAP

Uma classe pode implementar um nmero indefinido de interfaces em sua seo pblica. A figura esquerda do diagrama demonstra a parte de declarao e implementao de uma classe local C1, que implementa diversas interfaces em sua seo pbica. A classe deve implementar todas os mtodos de interface em sua parte de implementao. A figura direita ilustra a estrutura da classe com os componentes em suas respectivas reas de visibilidade, e a implementao dos mtodos. Os componentes da interface ampliam a seo pblica da classe em qual eles foram declarados.

Interfaces - Exemplo IntrodutrioO exemplo simples a seguir demonstra como se pode usar uma interface para implementar dois contadores que so diferentes, mas podem ser acessados da mesma maneira. Veja tambm o exemplo da seo de Classes.

INTERFACE I_COUNTER. METHODS: SET_COUNTER IMPORTING VALUE(SET_VALUE) TYPE I, INCREMENT_COUNTER, GET_COUNTER EXPORTING VALUE(GET_VALUE) TYPE I. ENDINTERFACE.

52/70

OOP em ABAPCLASS C_COUNTER1 DEFINITION. PUBLIC SECTION. INTERFACES I_COUNTER. PRIVATE SECTION. DATA COUNT TYPE I. ENDCLASS. CLASS C_COUNTER1 IMPLEMENTATION. METHOD I_COUNTER~SET_COUNTER. COUNT = SET_VALUE. ENDMETHOD. METHOD I_COUNTER~INCREMENT_COUNTER. ADD 1 TO COUNT. ENDMETHOD. METHOD I_COUNTER~GET_COUNTER. GET_VALUE = COUNT. ENDMETHOD. ENDCLASS. CLASS C_COUNTER2 DEFINITION. PUBLIC SECTION. INTERFACES I_COUNTER. PRIVATE SECTION. DATA COUNT TYPE I. ENDCLASS. CLASS C_COUNTER2 IMPLEMENTATION. METHOD I_COUNTER~SET_COUNTER. COUNT = ( SET_VALUE / 10) * 10. ENDMETHOD. METHOD I_COUNTER~INCREMENT_COUNTER. IF COUNT GE 100. MESSAGE I042(00). COUNT = 0. ELSE. ADD 10 TO COUNT. ENDIF. ENDMETHOD. METHOD I_COUNTER~GET_COUNTER. GET_VALUE = COUNT. ENDMETHOD. ENDCLASS. A interface I_COUNTER contm trs mtodos: SET_COUNTER, INCREMENT_COUNTER, e GET_COUNTER. As classes C_COUNTER1 e C_COUNTER2 implementam a seo pblica da interface. Ambas as classes devem implementar os trs mtodos de interface em sua parte de implementao. C_COUNTER1 uma classe para contadores que pode ter qualquer valor inicial e ento so acrescidos de um. C_COUNTER2 uma classe para contadores que podem apenas ser acrescidos de 10 em 10. Ambas as classes tem uma interface de sada idntica. A seo a seguir explica como um usurio pode usar uma referncia de interface para acessar os objetos em ambas as classes.

53/70

OOP em ABAP

Primeiro, duas variveis referenciais de classe CREF1 e CREF2 so declaradas para as classes C_COUNTER1 e C_COUNTER2. Uma referncia de interface IREF tambm declarada para a interface I_COUNTER. Todas as variveis referenciais so iniciais.

54/70

OOP em ABAP

O comando CREATE OBJECT cria um objeto para cada classe que as referncias CREF1 e CREF2 indicam.

55/70

OOP em ABAP

Quando a referncia de CREF1 atribuda a IREF, a referncia em IREF tambm indica ao objeto com o nome interno C_COUNTER.

Ativando e Manipulando EventosEm objetos ABAP, ativar e manipular um vento significa que certos mtodos agem como gatilhos que disparam eventos, ao quais outros mtodos os manipuladores reagem. Isto significa que os mtodos de manipulao so executados quando o evento ocorre. Esta seo contm explicao de como trabalhar com eventos em objetos ABAP. Para detalhes precisos dos comandos ABAP relevantes, procure a palavra-chave correspondente no ABAP Editor.

Ativando EventosPara disparar um evento, uma classe deve Declarar o evento em sua parte de declaraes Ativar o evento em um de seus mtodos

Declarando EventosVoc declara eventos na parte de declarao de uma classe ou interface. Para declarar eventos de instancia, use o seguinte comando:

56/70

OOP em ABAPEVENTS EXPORTING... VALUE() TYPE type [OTIONAL].. Para declarar eventos estticos, use o comando a seguir: CLASS-EVENTS ... Ambos os comando tm a mesma sintaxe. Quando se declara um evento, voc pode usar a adio EXPORTING para especificar parmetros que so passados ao manipulador de eventos. Os parmetros so sempre passados por valor. Eventos de instancia sempre contm o parmetro implcito SENDER, que tem o tipo de uma referncia para o tipo ou interface em qual o evento declarado.

Disparando EventosUm evento de instancia em uma classe pode ser disparado por qualquer mtodo na classe. Eventos estticos podem ser ativados por qualquer mtodo esttico. Para ativar um evento em um mtodo, use o comando a seguir: RAISE EVENT EXPORTING... = ... Para cada parmetro formal que definido como obrigatrio deve-se passar um parmetro atual correspondente na adio EXPORTING. A auto-referncia ME automaticamente passada para o parmetro implcito SENDER.

Manipulando EventosEventos so manipulados usando mtodos especiais. Para manipular um evento, um mtodo deve: Ser definido como manipulador para aquele evento Ser registrado em tempo de execuo para o evento.

Declarando Mtodos de Manipulao de EventosQualquer classe pode conter mtodos de manipulao de eventos para eventos de outras classes. Voc pode, claro, tambm definir mtodos de manipulao de eventos na mesma classe que o prprio evento. Para declarar um mtodo de manipulao de evento de instancia, use o comando as seguir: METHODS FOR EVENT OF IMPORTING.. .. Para um mtodo esttico, use CLASS-METHODS ao invs de METHODS: threshold. diff = count - threshold. RAISE EVENT critical_value EXPORTING excess = diff. ENDIF. ENDMETHOD. ENDCLASS. CLASS handler DEFINITION. PUBLIC SECTION. METHODS handle_excess FOR EVENT critical_value OF counter IMPORTING excess. ENDCLASS. CLASS handler IMPLEMENTATION. METHOD handle_excess. WRITE: / 'Excess is', excess. ENDMETHOD. ENDCLASS.

61/70

OOP em ABAPDATA: r1 TYPE REF TO counter, h1 TYPE REF TO handler. START-OF-SELECTION. CREATE OBJECT: r1, h1. SET HANDLER h1->handle_excess FOR ALL INSTANCES. DO 20 TIMES. CALL METHOD r1->increment_counter. ENDDO. A classe COUNTER implementa um contador. Ele ativa o evento CRITICAL_VALUE quando um valor limite excedido, e mostra a diferena. HANDLER pode manipular a exceo em COUNTER. Em tempo de execuo, o handler registrado para todas as variveis referenciais que apontam para o objeto.

Eventos em Objetos ABAP - ExemploO exemplo a seguir mostra como declarar, chamar, e manipular eventos em objetos ABAP.

Viso GeralEste objeto trabalha com a lista interativa mostrada abaixo. Cada interao do usurio dispara um evento em objetos ABAP. A lista juntamente com seus dados criada na classe C_LIST. H uma classe STATUS para processar aes do usurio. Ela dispara um evento chamado BUTTON_CLICKED no evento AT USER-COMMAND. O evento manipulado na classe C_LIST. Ela contm um objeto da classe C_SHIP ou C_TRUCK para cada linha da lista. Ambas estas classes implementam a interface I_VEHICLE. Quando a velocidade de um destes objetos muda, o evento SPEED_CHANGE ativado. A classe C_LIST reage e atualiza a lista.

62/70

OOP em ABAPContras

Os comandos ABAP usados para processamento de lista ainda no esto completamente disponvel em objetos ABAP. No entanto, para produzir uma nica sada de teste, pode-se usar os seguintes comandos: WRITE [AT] /() ULINE SKIP

NEW-LINE

Nota: O comportamento das funes de formatao e interao de lista em seu estado atual no garantido. Mudanas incompatveis podem ocorrer em um release futuro.

DeclaraesEste exemplo implementado usando interfaces e classe locais. Abaixo esto as declaraes das interfaces e classes: ***************************************************************** * Interface and Class declarations ***************************************************************** INTERFACE I_VEHICLE. DATA MAX_SPEED TYPE I.

EVENTS SPEED_CHANGE EXPORTING VALUE(NEW_SPEED) TYPE I. METHODS: DRIVE, STOP. ENDINTERFACE. *---------------------------------------------------------------CLASS C_SHIP DEFINITION. PUBLIC SECTION. METHODS CONSTRUCTOR. INTERFACES I_VEHICLE. PRIVATE SECTION.

63/70

OOP em ABAPALIASES MAX FOR I_VEHICLE~MAX_SPEED. DATA SHIP_SPEED TYPE I. ENDCLASS. *---------------------------------------------------------------CLASS C_TRUCK DEFINITION. PUBLIC SECTION. METHODS CONSTRUCTOR. INTERFACES I_VEHICLE. PRIVATE SECTION. ALIASES MAX FOR I_VEHICLE~MAX_SPEED. DATA TRUCK_SPEED TYPE I. ENDCLASS. *---------------------------------------------------------------CLASS STATUS DEFINITION. PUBLIC SECTION. CLASS-EVENTS BUTTON_CLICKED EXPORTING VALUE(FCODE) LIKE SY-UCOMM. CLASS-METHODS: CLASS_CONSTRUCTOR, USER_ACTION. ENDCLASS. *---------------------------------------------------------------CLASS C_LIST DEFINITION. PUBLIC SECTION. METHODS: FCODE_HANDLER FOR EVENT BUTTON_CLICKED OF STATUS IMPORTING FCODE, LIST_CHANGE FOR EVENT SPEED_CHANGE OF I_VEHICLE IMPORTING NEW_SPEED, LIST_OUTPUT. PRIVATE SECTION. DATA: ID TYPE I, REF_SHIP TYPE REF TO C_SHIP, REF_TRUCK TYPE REF TO C_TRUCK, BEGIN OF LINE, ID TYPE I, FLAG,

64/70

OOP em ABAPIREF TYPE REF TO I_VEHICLE, SPEED TYPE I, END OF LINE, LIST LIKE SORTED TABLE OF LINE WITH UNIQUE KEY ID. ENDCLASS. *****************************************************************

Os seguintes eventos so declarados no exemplo: O evento de instancia SPEED_CHANGE na interface I_VEHICLE O evento esttico BUTTON_CLICKED na classe STATUS

A classe C_LIST contm mtodos de manipulao de eventos para ambos os eventos. Note que a classe STATUS no tem qualquer atributo, e, portanto apenas trabalha com mtodos estticos e eventos.

ImplementaesAbaixo esto as implementaes dos mtodos das classes acima: ***************************************************************** * Implementations ***************************************************************** CLASS C_SHIP IMPLEMENTATION. METHOD CONSTRUCTOR. MAX = 30. ENDMETHOD. METHOD I_VEHICLE~DRIVE. CHECK SHIP_SPEED < MAX. SHIP_SPEED = SHIP_SPEED + 10. RAISE EVENT I_VEHICLE~SPEED_CHANGE EXPORTING NEW_SPEED = SHIP_SPEED. ENDMETHOD. METHOD I_VEHICLE~STOP. CHECK SHIP_SPEED > 0. SHIP_SPEED = 0. RAISE EVENT I_VEHICLE~SPEED_CHANGE EXPORTING NEW_SPEED = SHIP_SPEED. ENDMETHOD. ENDCLASS. *---------------------------------------------------------------CLASS C_TRUCK IMPLEMENTATION.

65/70

OOP em ABAPMETHOD CONSTRUCTOR. MAX = 150. ENDMETHOD. METHOD I_VEHICLE~DRIVE. CHECK TRUCK_SPEED < MAX. TRUCK_SPEED = TRUCK_SPEED + 50. RAISE EVENT I_VEHICLE~SPEED_CHANGE EXPORTING NEW_SPEED = TRUCK_SPEED. ENDMETHOD. METHOD I_VEHICLE~STOP. CHECK TRUCK_SPEED > 0. TRUCK_SPEED = 0. RAISE EVENT I_VEHICLE~SPEED_CHANGE EXPORTING NEW_SPEED = TRUCK_SPEED. ENDMETHOD. ENDCLASS. *---------------------------------------------------------------CLASS STATUS IMPLEMENTATION. METHOD CLASS_CONSTRUCTOR. SET PF-STATUS 'VEHICLE'. WRITE 'Click a button!'. ENDMETHOD. METHOD USER_ACTION. RAISE EVENT BUTTON_CLICKED EXPORTING FCODE = SY-UCOMM. ENDMETHOD. ENDCLASS. *---------------------------------------------------------------CLASS C_LIST IMPLEMENTATION. METHOD FCODE_HANDLER . CLEAR LINE. CASE FCODE. WHEN 'CREA_SHIP'. ID = ID + 1. CREATE OBJECT REF_SHIP. LINE-ID = ID. LINE-FLAG = 'C'. LINE-IREF = REF_SHIP. APPEND LINE TO LIST. WHEN 'CREA_TRUCK'. ID = ID + 1. CREATE OBJECT REF_TRUCK. LINE-ID = ID. LINE-FLAG = 'T'. LINE-IREF = REF_TRUCK. APPEND LINE TO LIST. WHEN 'DRIVE'.

66/70

OOP em ABAPCHECK SY-LILLI > 0. READ TABLE LIST INDEX SY-LILLI INTO LINE. CALL METHOD LINE-IREF->DRIVE. WHEN 'STOP'. LOOP AT LIST INTO LINE. CALL METHOD LINE-IREF->STOP. ENDLOOP. WHEN 'CANCEL'. LEAVE PROGRAM. ENDCASE. CALL METHOD LIST_OUTPUT. ENDMETHOD. METHOD LIST_CHANGE . LINE-SPEED = NEW_SPEED. MODIFY TABLE LIST FROM LINE. ENDMETHOD. METHOD LIST_OUTPUT. SY-LSIND = 0. SET TITLEBAR 'TIT'. LOOP AT LIST INTO LINE. IF LINE-FLAG = 'C'. WRITE / ICON_WS_SHIP AS ICON. ELSEIF LINE-FLAG = 'T'. WRITE / ICON_WS_TRUCK AS ICON. ENDIF. WRITE: 'Speed = ', LINE-SPEED. ENDLOOP. ENDMETHOD. ENDCLASS. *****************************************************************

O mtodo esttico USER_ACTION da classe STATUS dispara o evento esttico BUTTON_CLICKED. Os mtodos de instancia I_VEHICLE~DRIVE e I_VEHICLE~STOP disparam o evento de instancia I_VEHICLE~SPEED_CHANGE nas classes C_SHIP e C_TRUCK.

Usando As Classes em um ProgramaO programa a seguir usa as classes acima: REPORT OO_EVENTS_DEMO NO STANDARD PAGE HEADING. ***************************************************************** * Global data of program ***************************************************************** DATA LIST TYPE REF TO C_LIST. ***************************************************************** * Program events *****************************************************************

67/70

OOP em ABAPSTART-OF-SELECTION. CREATE OBJECT LIST. SET HANDLER: LIST->FCODE_HANDLER, LIST->LIST_CHANGE FOR ALL INSTANCES. *---------------------------------------------------------------AT USER-COMMAND. CALL METHOD STATUS=>USER_ACTION. ***************************************************************** O programa cria um objeto da classe C_LIST e registra o mtodo de manipulao de evento FCODE_HANDLER do objeto para o