Professional Documents
Culture Documents
Treinamento
SAP R/3
MDULO ABAP
ABAP OBJECTS
TREINAMENTO
Data : 12/02/08
CURSO DE ABAP/4
Pgina 2 de 57
TREINAMENTO
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
existents, e tambm adicionar novos.
Esta seo do guia do usrio ABAP fornece uma viso geral da extenso orientada a objeto da
linguagem ABAP. Ns temos usados apenas exemplos simples para demonstrar como se utiliza as
novas ferramentas. No entanto, estas pretendem ser um modelo para design orientada 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 m ais ttulos listados abaixo.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 3 de 57
TREINAMENTO
Leitura Posterior
H muitos livros sobre orientao a objeto, linguagem de programao orientadas 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 a 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
Um 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 modelamento). 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 4 de 57
TREINAMENTO
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 orientado 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 sequncia
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
entitulado 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 completes, ou necessariamente os melhores livros disponveis.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 5 de 57
TREINAMENTO
estruturada, onde os dados so guardados em tabelas de banco de dados e programas
orientadospor funes acessam e trabalham com eles.
A mudana orientada a objeto do ABAP baseado em modelos de Java e C++. comptivel com
objetos externos como DCOM e CORBA. A implementao de elementos orientados a objeto no
kernel da linguagem ABAP tem consideravelmente aumentado o tempo de resposta quando se
trabalha com objetos ABAP. SAP Business Objects e objetos GUI j orientados eles mesmos
vo tambm lucrar de serem incorporados no objetos ABAP.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 6 de 57
TREINAMENTO
A instance de um grupo de funes na area 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 instance 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 instances de diversos grupos de funes simultaneamente, ele no
pode trabalhar com diversas instances do mesmo grupo de funes. Suponha que um programa
necessite vrios contadores independents, ou processar vrias ordens ao mesmo tempo. Neste
caso, voc teria que adaptar ogrupo de funes a incluir administrao de instance, por exemplo,
usando nmeros para diferenci-las.
Na prtica, isto muito estranho. Consequentemente, os dados so usualmente guardados no
programa chamador, e os mdulos de funes so chamados para trabalhar com ele
(programao estruturada). Um problem , por exemplo, que todos os usurios do mdulo de
funo devem utilizar os mesmos dados assim como o grupo de funes. Modificando a estrura
interna dos dados de um grupo de funes afeta vrios usurios, e frequentemente difcil de
prever implicaes. O nico modo de evitar depender muito de interfaces e de uma tcnica que
garante que as estruturas internas das instances vo permanecer ocultas, permitindo que
modifique-as mais tarde sem causar problemas.
Este requerimento atingido por orientao a objeto. Olbjetos ABAP permite 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 instances (objetos) baseados no mesmo template.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 7 de 57
TREINAMENTO
Ao invs de carregar uma nica instance de um grupo de funes dentro de uma memria implcita
quando um modulo chamado, o programa ABAP pode agora gerar as instances de classes
explicitamente usando o novo comando ABAP CREATE OBJECT. As instances individuais
represnetam objetos nicos. Voc enderea estes usando referencias a objetos. As referncias
aos objetos permitem que o programa ABAP acesse as interfaces das instances.
Exemplo
O exemplo a seguir demonstra o aspecto orientado a objeto de grupo de funes no simples caso
de um contador.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 8 de 57
TREINAMENTO
FUNCTION 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 sida 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 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.
4 - Grfico Geral
Classes
Data : 12/02/08
CURSO DE ABAP/4
Pgina 9 de 57
TREINAMENTO
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 components pblicos da classe formam a interface entre a classe e seus usurios. Os
componentes protegidos so uma interface paran as subclasses de C1. 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 components da classe.
5 - Grfico Geral
Objetos como Instances de uma Classe
Data : 12/02/08
CURSO DE ABAP/4
Pgina 10 de 57
TREINAMENTO
A ilustaro acima mostra uma classe C1 a esquerda, com suas instances representadas na
sesso interna de um programa ABAP a direita. Para distingu-los de classes, instances so
desenhadas com cantos redondos. Os nomes das instances acima usam a mesma notao como
usada para variveis de referncia no Debugger.
Exemplo:
Data : 12/02/08
CURSO DE ABAP/4
Pgina 11 de 57
TREINAMENTO
O comando DATA cria uma varivel CREF1de referncia a classe com tipo C_COUNTER. Esta
varivel pode conter referncias a todas as instances 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 globamente usando o Class
Builder. O contedo de CREF1 so inciais. A referncia no indica para uma intance.
Declarando Mtodos
Voc pode declarar mtodos na parte de declarao de uma classe ou em uma interface. Para
declarar mtodos de instance, use o seguinte comando:
METHODS <meth> IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..
EXPORTING.. [VALUE(]<ei>[)] TYPE type [OPTIONAL]..
CHANGING.. [VALUE(]<ci>[)] TYPE type [OPTIONAL]..
Data : 12/02/08
CURSO DE ABAP/4
Pgina 12 de 57
TREINAMENTO
RETURNING VALUE(<r>)
EXCEPTIONS.. <ei>..
E as adies apropriadas.
Para declarar mtodos estticos, use o seguinte comando:
CLASS-METHODS <meth>...
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 sada,
entrada, e 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 dio 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 Mtodos
Voc deve implementar todos os mtodos dentro de uma classe na parte de implementao desta
em um bloco.
METHOD <meth>.
...
ENDMETHOD.
Quando voc implementa o mtodo, no precisa especificar quaisquer parmetros de interface, j
que so definidos dentro da delcarao do mtodo. Os parmetros de interface de um mtodo
comportam-se como variveis locais dentro do mtodo de implementao. Voc pode definir
variveis locais adicionais dentro de um mtodo usando o comando DATA.
Assim como mdulos de funes, voc pode usar o comando RAISE <exception> 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 instances podem trabalhar com ambos atributos
estticos ou instances.
Chamando Mtodos
Para chamar um mtodo, use o seguinte comando:
Data : 12/02/08
CURSO DE ABAP/4
Pgina 13 de 57
TREINAMENTO
CALL METHOD <meth> EXPORTING... <ii> =.<f i>...
IMPORTING... <ei> =.<g i>...
CHANGING ... <ci> =.<f i>...
RECEIVING
r=h
EXCEPTIONS... <ei> = rc i...
O modo de que voce enderea o mtodo <meth> depende do mtodo prrpio e de onde voc est
o chamando. Dentro da parte de implementao da classe, voc pode chamar os mtodos da
mesma classe diretamente usando o nome <meth> deles.
CALL METHOD <meth>...
Fora da classe, a visibilidade do mtodo depende onde voe pode cham-lo. Mtodos de instances
visveis poodem ser chamados de for a da classe usando:
CALL METHOD <ref>-><meth>...
Onde <ref> uma varivel de referncia cujo valor indica uma instance da classe. Mtodos de
instances visveis podem ser chamados de for a da classe usando:
CALL METHOD <class>=><meth>...
onde <class> o nome da classe relevant.
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 pelas exceptions
usando a adio EXCEPTIONS. No entanto, isto altamente recomendado.
Voc passa e recebe valores para e de mtodos da mesma maneira que em mdulos de funes,
incluindo a sintaxe aps a adio correspondente:
... <Formal parameter> = <Actual parameter>
Os parmetros de interface (formal parameters) esto sempre do lado esquerdo do sinal de
igualdade. O novo parmetro est sempre a direita. O sinal de igual no um operador de
assimilio neste contexto, ele meramente serve para copiar varoveis do programa para os
parmetros de interface d 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 <method>( f).
O parmetro <f> 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 <method>(....<ii> =.<f i>...).
Data : 12/02/08
CURSO DE ABAP/4
Pgina 14 de 57
TREINAMENTO
Cada actual parameter <f i > passado correspondenteis ao formal parameter <i
>.
Constructors
Constructors 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 stati 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 predifinido de uma instance CONSTRUCTOR.
You declare it in the public section as follows:
METHODS CONSTRUCTOR
IMPORTING.. [VALUE(]<ii>[)] TYPE type [OPTIONAL]..
EXCEPTIONS.. <ei>.
E implementa-a na selo de implementao como qualquer outro mtodo. O sistema chama o
instance constructor uma vez para cada instance da classe, diretamente aps o objeto ter sido
criado no comando CREATE OBJECT. Voc pode passar parmetros de entrada do instance
constructor e lida com excees usando as adies EXPORTING e EXCEPTIONS.
O static constructor de uma classe um mtodo static constructor pr-definido
CLASS_CONSTRUCTOR. Voc o declara na seo pblica como segue:
CLASS-METHODS CLASS_CONSTRUCTOR.
E implementa 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 no pode ento acessar components
de sua prpria classe.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 15 de 57
TREINAMENTO
Viso Geral
Este exemplo usa trs classes chamdas 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 instances igual ao total da classe
C_BIKER de membros no time. Cada instance da classe C_BIKER cria uma instance da classe
C_BICYCLE.
Cada instance 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
instances da classe C_BIKER permite que o usurio escolha a ao em uma selection screen
posterior.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 16 de 57
TREINAMENTO
Data : 12/02/08
CURSO DE ABAP/4
Pgina 17 de 57
TREINAMENTO
Conflitos
Declaraes
Este exemplo 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.
*------------------------------------------------------------------
Data : 12/02/08
CURSO DE ABAP/4
Pgina 18 de 57
TREINAMENTO
CLASS C_TEAM DEFINITION.
PUBLIC 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,
Data : 12/02/08
CURSO DE ABAP/4
Pgina 19 de 57
TREINAMENTO
STATUS_LINE EXPORTING LINE
TYPE C_TEAM=>STATUS_LINE_TYPE.
PRIVATE SECTION.
CLASS-DATA COUNTER TYPE I.
DATA: 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 apenas
serem modificados pelos prprios mtodos. O classe C_TEAM Contm um static constructor
CLASS_CONSTRUCTOR. C_TEAM e C_BIKER ambos contm instance constructors.
Implementaes
As partes de implementao contm as implementaes de todos os mtodos delcarados nas
partes correspondents de declarao. As interfaces dos mtodos j foram definidos na declarao.
Nas implementaes, os parmetros de interface se comportam como dado local.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 20 de 57
TREINAMENTO
Data : 12/02/08
CURSO DE ABAP/4
Pgina 21 de 57
TREINAMENTO
O mtodo pblico de instance CREATE_TEAM pode ser chamado por qualquer usurio da classe
contendo uma varivel de referncia com uma referncia para a instance da classe. usada para
criar instances 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 a classe
C_BIKER no comando CREATE OBJECT. As referncias para a novas instances 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 instance 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 area de
trabalho STATUS_LINE para acrescentar o parmetro de sada LINE tabela interna privada
STATUS_LIST.
SELECTION
METHOD 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 instance pblica SELECTION pode ser chamado por qualquer usurio da classe
contendo uma varivel referencial com referncia a uma instance 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 correspondents variveis referenciais 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 instance pblica EXECUTION pode ser chamado por qualquer usurio da classe
contendo um varivel referencial com uma referncia para uma instance da classe. O mtodo
chama dois mtodos SELECT_ACTION e STATUS_LINE para cada instance 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 area de trabalho STATUS_LINE sobrescrita e mostrada
pelo mtodo privado WRITE_LIST.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 22 de 57
TREINAMENTO
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.
ENDLOOP.
ENDMETHOD.
O mtodo privado de instance 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 23 de 57
TREINAMENTO
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.
CALL METHOD BIKER_ACTION( ACTIVITY).
ENDMETHOD.
O mtodo da instance pblica SELECT_ACTION pode ser chamada por qualquer usurio da
classe contendo uma varivel referencial com uma referncia para uma instance da classe. O
mtodo chama a selection screen 200 e analiza 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 actual parameter ACTIVITY para o formal parameter 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 24 de 57
TREINAMENTO
O mtodo de instance 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 instance pblica STATUS_LINE pode ser chamada por qualquer usurio da classe
contendo uma varivel referencial com uma referncia para uma instance da classe. Isto atribui ao
parmetro estruturado de sada LINE com os valores de atributos atuais da instance
correspondente.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 25 de 57
TREINAMENTO
O mtodo da instance pblica STOP pode ser chamada por qualquer usurio da classe contendo
uma varivel referencial com uma referncia para uma instance da classe.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 instance pblica CHANGE_GEAR pode ser chamada por qualquer usurio da classe
contendo uma varivel referencial com uma referncia para uma instance da classe. O mtodo
muda o valor do atributo privado GEAR. J que o formal parameter com o mesmo nome obscurece
o atributo dentro do mtodo, o atributo tem de ser endereado usando a referncia prpria
ME->GEAR.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 26 de 57
TREINAMENTO
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.
CALL 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.
*******************************************************************
Data : 12/02/08
CURSO DE ABAP/4
Pgina 27 de 57
TREINAMENTO
O programa contm trs variveis referenciais a classes que se referem a classe C_TEAM. Ele cria
trs objetos da classe, para os quais as referncias dentro das variveis referenciais ento
indicam. Em 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:
9 - Herana
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 <subclass> DEFINITION INHERITING FROM <superclass>.
A nova classe <subclass> herda todos os componentes da classe existente <superclass>. A nova
classe chamada derivada da qual ela herdou. E a original chamada superclass da nova classe.
Se voc adicionar novas declaraes subclass ela contm os mesmo componentes da
superclass. No entanto, apenas os componentes pblicos e protegidos da superclass esto
visveis na subclass. Apesar os componentes privados da superclass existirem na subclass, eles
no est visveis. Voc pode declarar componentes privados em uma subclass que tem os mesmo
noems dos componentes privados da superclass. Cada classe trabalha com seus prprios
componentes privados. Mtodos que uma subclass herda de uma superclass, e no qualquer
componentes da subclass com mesmo nomes.
Se a superclass no tem uma seo de visibilidade privada, a subclass uma rplica exata da
superclass. No entanto, voc pode adicionar novos componentes subclass. Isto lhe permite que
torne uma subclass em uma verso especializada da superclass. Se uma subclass tambm
umaa superclass, voc introduz um novo nvel de especializao.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 28 de 57
TREINAMENTO
Uma classe pode ter mais do que uma subclass direta, mas apenas uma superclass direta. Isto
chamada herana simples. Quando subclasses herdam de superclasses e as superclass
tambm uma subclass de outra classe, todas as classes envolvidas formam uma rvore de
herana, cujos degraus de especializao aumentam com cada novo nvel hierarquico que voc
adicone. 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 como a superclass
a relao sempre definida implicitamente. Dentro de uma rvore de herana, dois ns adjacentes
so a superclass direta ou subclass direta uma da outra. Outros ns relacionados so referidos
como superclass ou subclass. A declarao de componentes de uma subclass so distribudas
atravs todos os nveis da rvore de herana.
Redefinindo Mtodos
Todas 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 mudado. No entanto, voc pode
usar a adio REDEFINITION no comando METHODS para redefinir mtodo de instance pblico
ou protegido em uma subclass 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 superclass no afetada quando voc redefine o
mtodo dentro de uma subclass. A implementao da redefinio na subclass obscurece a
implementao original na superclass.
Qualquer referncia que indique para um objeto da subclass usa o mtodo redefinido, at mesmo
se a referncia foi definida com referncia a superclass. Isto particularmente se aplica a autoreferncia ME->. Se, por exemplo, um mtodo de superclass M1 contm uma chamada CALL
METHOD [ME->]M2, e M2 redefinido em uma subclass, chamando M1 de uma instance da
subclass que vai cuasar o mtodo M2 original seja chamada, e chamando M1 de uma instance da
subclass vai causar o mtodo M2 redefinido seja chamado.
Dentro de um mtodo redefinido, voc pode usar a pseudoreferncia SUPER-> para acessar o
mtodo obscuro. Isto permite-lhe usar a funo existente do mtodo dentro da superclass sem ter
de recodific-lo na subclass.
CURSO DE ABAP/4
Pgina 29 de 57
TREINAMENTO
Variveis referenciais definidas como referncia para uma superclass ou uma interface definida
com referncia para ela tambm contm referncias para qualquer uma de suas subclasses. J
que 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 superclass ou uma interface implementada por uma superclass pode conter referncias para
instances de qualquer de suas subclasses. Em particular, voc pode definir a 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 subclass, voc pode usar a adio TYPE para criar uma instance
de subclass, 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 superclass para qual a varivel referencial indica. No entanto, no pode enderear qualuqer
especializao na subclass. Se voc usar um mtodo de chamada dinmico, voc pode enderear
todos os componentes da classe.
Se voc redefinir um mtodo de instance 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 30 de 57
TREINAMENTO
Herana e Constructors
H regras especiais gerenciando constructors em herana.
Instance Constructors
Toda 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
independents uma da outra. Voc no pode redefinir o instance constructor de uma superclass
dentro de uma subclass, nem chamar um especificamente usando o comando CALL METHOD
CONSTRUCTOR. Consequentemente, conflitos de nomes no podem ocorrer.
O instance constructor de uma classe chamado pelo sistema quando chamado pelo sistema
quando vo cria uma instance de classe usando CREATE OBJECT. J que uma subclass contm
todos os atributos visveis de suas superclasses, que so tambm preparadas pelo instance
contructors de todas as suas superclasses so tambm chamados. Para fazer isso, o instance
constructor de cada subclass deve conter um comando
CALL METHOD SUPER->CONSTRUCTOR. A nica exceo 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 superclass
imediata chamada.
Quando voc chama um instance constructor, voc deve suprir valores para todos os parmetros
de interface obrigatrios. H varias maneiras de fazer isto:
Data : 12/02/08
CURSO DE ABAP/4
Pgina 31 de 57
TREINAMENTO
Se a superclass direta tem um instance constructor se uma interface, voc no passa
qualquer parmetros.
Se a superclass direta no tem um instance constructor explcito, voc deve olhar na
rvore de herana pela prxima mais alta superclass com um instance constructor
explcito. Se isto tem uma interface, voc deve suprir valores usando EXPORTING. Seno,
no precisa passar quaisquer valores.
Em ambos CREATE OBJECT e CALL METHOD SUPER->CONSTRUCTOR, voc deve olhar ao
prximo disponvel instance constructor explcito e, se tiver uma interface, passar valores para ele.
O mesmo se aplica para manipulao de excees para instance constructors. Quando voc
trabalha com herana, voc precisa de um conhecimento preciso de toda a rvore de herana.
Quando voc cria uma instance para uma classe na parte mais baixa da rvore de herana, voc
pode precisa passar parmetros para o constructor de uma classe que est muito mais prxima do
n-raiz.
O instance constructor de uma subclass dividia em duas partes pelo comando CALL METHOD
SUPER->CONSTRUCTOR. Nas linhas antes da chamada, o constrcutor se comporta como um
mtodo esttico, isso , no pode acessar os atributos de instance da sua classe. Voce no pode
enderear atributos de instances at depois da chamada. Use os comandos antes da chamada
para determinar os actual parameters para a interface do instance constructor da superclass. Voc
pode apenas usar atributos estticos ou dados locais para fazer isto.
Quando voc cria uma instance de uma subclass, o instance constructors so chamados
hierarquicamente. O primeiro nvel de nesting em qual voc pode enderear atributos de instances
o nvel mais alto superclass. Quando voc retorna ao constructors das classes com level mais
baixos, voc pode tambm sucessivamente enderear seus atributos de instances.
Em um mtodo de constructor, os mtodos das subclasses da classe no so visveis. Se um
instance constructor chama um mtodo de instance 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 subclass 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 hierarquica, as mesmas regras de um instance constructor se
aplicam a um static constructor.
A primeira vez que voc enderea uma subclass em um programa, o static constructor
executado. No entanto, antes que possa ser executado, os statics constructors de todas as
superclasses devem j terem sido executadas. Um static constructor pode apenas ser chamado
uma vez por programa. Portanto, quando voc enderea uma subclass, o sistema procura pela
Data : 12/02/08
CURSO DE ABAP/4
Pgina 32 de 57
TREINAMENTO
prxima mais alta superclass cujo static constructor ainda no foi executado, seguido de todas as
classes entre entre aquela e a subclass que voc endereou.
A parte esquerda do grfico demonstra como voc pode derivar uma subclass c2 de uma
superclass c1 usando a adio INHERTING FROM no comando CLASS. A parte direita do grfico
demonstra como a distribuio da subclass dentro da rvore de herana, que alcana classe vazia
default OBJECT. Uma subclass contm todos os componentes declarados acima dela na rvore de
herana, e pode enderear todas elas que so delcaradas pblicas ou protegidas.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 33 de 57
TREINAMENTO
Herana Simples
Este grfico ilustra herana simples. Uma classe pode apenas ter uma superclass direta, mas pode
ter mais do que uma subclass direta. A classe vazia OBJECT o n-raiz de toda rvore de
herana em objetos ABAP.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 34 de 57
TREINAMENTO
Este grfico demonstra como variveis referenciais definidas com referncia para uma superclass
pode indicar objetos de subclasses. O objeto a direita uma instance da classe class3. As
variveis referenciais de classe CREF1, CREF2, e CREF3 so digitadas com referncia a class1,
class2, e class3. Todas as trs indicam ao objeto. No entanto, CREF1 pode apenas enderear os
componentes pblicos da classe class1, CREF2 pode enderear os componentes pblicos da
class1 e class2. CREF3 pode enderear componentes pblicos de todas as classes.
Se voc redefinir um mtodo de uma superclass em uma subclass, voc pode usar uma varivel
referencial definida com referncia a superclass para enderear objetos com diferentes
implmentaes de mtodos.. Quando voc enderea a superclass, o mtodo tem a implementao
original, mas quando voc enderea a subclass, o mtodo tem a nova implementao. Usando
uma simples varivel de referncia para chamar mtodos com mesmo nome que se comportam
diferentemente chamado polimorfismo.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 35 de 57
TREINAMENTO
REPORT demo_inheritance.
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.
CLASS 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 36 de 57
TREINAMENTO
DO 20 TIMES.
CALL METHOD count->increment.
ENDDO.
A classe COUNTER_TEN derivada de COUNTER. Ela redefine o mtodo
INCREMENT. Para fazer isto, voc deve modificar a visibilidade do atributo
COUNT de privado para protegido. O mtodo redefinido chama o mtodo obscuro
da superclass usando a pseudoreferncia SUPER->. O mtodo redefinido uma
especializao do mtodo herdado.
O exemplo cria uma instance da subclass. A varivel referencial indicando para ela
tem o tipo da superclass. Quando o mtodo INCREMENT chamado usando a
referncia superclass, o sistema executa o mtodo redefinido da subclass.
12 - Interfaces
Classes, suas instances (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.
No entanto, frequentemente 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 conta
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 instances devem tambm estarem 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 permite 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 endereem diferentes classes via um ponto universal de contato.
Interfaces, junto com herana, fornce um dos pilares do polimorfismo, j que eles permitem um
mtodo simples dentro de uma interface se comportem diferentemente em diferentes classes.
Definindo Interfaces
Como classes, voc pode definir interfaces tanto globalmente no R/3 Repository ou locamente em
um programa ABAP. Para informaes sobe como definir interfaces locais, leia a seo Class
Builder na documentao de ferramentes do ABAP Workbench. A definio de uma interface local
<intf> includa nos comandos:
Data : 12/02/08
CURSO DE ABAP/4
Pgina 37 de 57
TREINAMENTO
INTERFACE <intf>.
...
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 Interfaces
Ao contrrio de classes, interfaces no possuem instances. Ao invs, interfaces so
implementadas por classes. Para implementar uma interface dentro de uma classe, use o comando
INTERFACES <intf>.
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 seom pblica. Um componente <icomp> de uma
interface <intf> pode ser endereada como se fosse uma membro da classe sob o nome
<intf~icomp>.
A 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 <imeth>:
METHOD <intf~imeth>.
...
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
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 toda o corpo pblico
da classe.
Referncia de Interface
Data : 12/02/08
CURSO DE ABAP/4
Pgina 38 de 57
TREINAMENTO
Variveis 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 referncial pode conter referncias a objetos de classes que implementam a interface
correspondente.
Para definir uma referncia de interface, use a adio TYPE REF TO <intf> no comando TYPES ou
DATA. <intf> 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
chamado uma varivel referencial de interface, ou referncia de interface para resumir.
Uma referncia de interface <iref> permite que um usurio utilize a forma <iref>-><icomp> para
enderear todos os componentes visveis da interface <icomp> 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.
Em relao a componentes estticos de interfaces, voc pode apenas utilizar o nome da interface
para acessar constants:
Enderelando uma constante <const>: < intf>=><const>
Para todos os outros componentes estticos de uma interface, voc pode apenas usar refernciais
a objetos ou a classe <class> que implementa a interface.
Endereando um atributo esttico <attr>: < class>=><intf~attr>
Chamando um mtodo esttico <meth>: CALL METHOD <class>=><intf~meth>
Data : 12/02/08
CURSO DE ABAP/4
Pgina 39 de 57
TREINAMENTO
13 - Grficos Gerais
Interfaces
Data : 12/02/08
CURSO DE ABAP/4
Pgina 40 de 57
TREINAMENTO
Classes podem implementar qualuqer nmeros de interfaces em suas sees pblicas. A figura a
esquerda do diagrama demonstra a parte de declarao e implementao de uma classe local C1,
que implementa diversas inerfaces em sua seo pbica. A classe deve implementar todas os
mtodos de interface em sua parte de implementao.
A figura a direita ilustra a estrutura da classe com os components em suas respectivas areas de
visibilidade, e a implementao dos mtodos. Os componetes da interface ampliam a seo
pblica da classe em qual eles foram declarados.
INTERFACE I_COUNTER.
METHODS: SET_COUNTER IMPORTING VALUE(SET_VALUE) TYPE I,
Data : 12/02/08
CURSO DE ABAP/4
Pgina 41 de 57
TREINAMENTO
INCREMENT_COUNTER,
GET_COUNTER EXPORTING VALUE(GET_VALUE) TYPE I.
ENDINTERFACE.
CLASS 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
Data : 12/02/08
CURSO DE ABAP/4
Pgina 42 de 57
TREINAMENTO
podem apenas ser acrescidos de 10 em 10. Ambas as classes tem uma cara de
sada idntica. completamente definido pela interface em ambos os casos.
A seo as eguir explica como um usurio pode usar uma referncia de interface
para enderear os objetos em ambas as classes.
Ativando Eventos
Para disparar um evento, uma classe deve
Declarando Eventos
Voc declara eventos na parte de declarao de uma classe ou interface. Para declarar eventos de
instance, use o seguinte comando:
EVENTS <evt> EXPORTING... VALUE(<ei>) TYPE type [OTIONAL]..
Para delcarar eventos estticos, use o comando a seguir:
CLASS-EVENTS <evt>...
Ambos os comando tm a mesma sintaxe.
Quando voc 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 instance sempre contm o parmetro implcito SENDER, que tem o tipo de
uma referncia para o tipo ou interface em qual o evento declarado.
Disparando Eventos
Um evento de instance em uma classe pode ser disparado por qual 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 <evt> EXPORTING... <ei> = <f i>...
Data : 12/02/08
CURSO DE ABAP/4
Pgina 43 de 57
TREINAMENTO
Para cada formal parameter <e i > que definido como obrigatrio, voc deve passar um actual
parameter correspondente <f i > na adio EXPORTING. A auto-referncia ME automaticamente
passada para o parmetro implcito SENDER.
Manipulando Eventos
Eventos so manipulados usando mtodos especiais. Para manipular um evento, um mtodo deve:
Data : 12/02/08
CURSO DE ABAP/4
Pgina 44 de 57
TREINAMENTO
A classe C1 contm um evento E1, que disparado pelo mtodo M1. Classe C2 contm um
mtodo M2, que pode manipular evento E1 da classe C1.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 45 de 57
TREINAMENTO
O programa cria uma instance da classe C1 e duas instances da classe C2. Os valores das
variveis referenciais R1, H1 e H2 indicam estas instances.
O comando SET HANDLER cria uma tabela de handler, invisvel ao usurio, para cada evento que
um mtodo de manipulao foi registrado.
A tabela de handlers contm nomes dos mtodos de manipulao e referncias instances
registradas. As entradas na tabela so administrada dinamicamente pelo comando SET
Data : 12/02/08
CURSO DE ABAP/4
Pgina 46 de 57
TREINAMENTO
HANDLER. Uma referncia para uma instance em uma tabela de handler como uma referncia
em uma varivel referencial. Em outras palavras, conta como um uso da instance, e portanto
diretamente afeta seu tempo de vida. No diagrama acima, isto significa que as instances C2<1> e
C2<2> no so deletadas pela coleta de lixo, mesmo se H1 e H2 so inicializados, enquanto seu
registro no deletado da taela de handler.
Para eventos estticos, o sistema cria uma tabela de handler independente de instance para a
classe relevante.
Quando um evento disparado, o sistema procura na tabela correspondente de eventos e executa
os mtodos nas instances apropriadas (ou na classe correspondente para um mtodo de
manipulao esttico.
REPORT demo_class_counter_event.
CLASS counter DEFINITION.
PUBLIC SECTION.
METHODS increment_counter.
EVENTS critical_value EXPORTING value(excess) TYPE i.
PRIVATE SECTION.
DATA: count
TYPE i,
threshold TYPE i VALUE 10.
ENDCLASS.
CLASS counter IMPLEMENTATION.
METHOD increment_counter.
DATA diff TYPE i.
ADD 1 TO count.
IF count > 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 47 de 57
TREINAMENTO
CLASS handler IMPLEMENTATION.
METHOD handle_excess.
WRITE: / 'Excess is', excess.
ENDMETHOD.
ENDCLASS.
DATA: 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 indicam ao objeto.
Viso Geral
Este objeto trabalha com a lista interativa mostrada abaixo. Cada interao do usurio dispara um
evento em objetos ABAP. A lista e seus dados criado 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 48 de 57
TREINAMENTO
Contras
NEW-LINE
Declaraes
Este exemplo implementado usando interfaces e classe locais. Abaixo esto as declaraes das
interfaces e classes:
*****************************************************************
* Interface and Class declarations
*****************************************************************
Data : 12/02/08
CURSO DE ABAP/4
Pgina 49 de 57
TREINAMENTO
INTERFACE I_VEHICLE.
DATA
MAX_SPEED TYPE I.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 50 de 57
TREINAMENTO
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,
IREF TYPE REF TO I_VEHICLE,
SPEED TYPE I,
END OF LINE,
LIST LIKE SORTED TABLE OF LINE WITH UNIQUE KEY ID.
ENDCLASS.
*****************************************************************
Data : 12/02/08
CURSO DE ABAP/4
Pgina 51 de 57
TREINAMENTO
Implementaes
Abaoixo esto as implementaes dos mtodos das classes acimas:
*****************************************************************
* 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.
METHOD 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 52 de 57
TREINAMENTO
*---------------------------------------------------------------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'.
CHECK 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.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 53 de 57
TREINAMENTO
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.
*****************************************************************
Data : 12/02/08
CURSO DE ABAP/4
Pgina 54 de 57
TREINAMENTO
START-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 evento de classe BUTTON_CLICKED, e o mtodo de
manipulao de evento LIST_CHANGE para o evento SPEED_CHANGE de todas as instances
que implementam a interface I_VEHICLE.
19 - Pool de Classes
Esta seo discute a estrutura e caractersticas especiais de pool de classes.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 55 de 57
TREINAMENTO
Data : 12/02/08
CURSO DE ABAP/4
Pgina 56 de 57
TREINAMENTO
Pool de classess contm uma parte de definio para declaraes de tipos, e as partes de
declarao e implementao da classe.
Data : 12/02/08
CURSO DE ABAP/4
Pgina 57 de 57