Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Sumrio
1 Prefcio
2 Memria eidtica: O mundo procedural
2.1 Definio dos dados
2.2 Definio da lgica
2.3 Refletindo sobre as definies no mundo procedural
2.3.1 Diviso de responsabilidades
2.3.2 Reaproveitamento de cdigo
2.3.3 Testes Unitrios
2.3.4 Encapsulamento
2.3.5 Falsos mitos sobre as vantagens de OO
2.4 O TOP Include do Grupo de Funo
3 Conceitos bsicos
3.1 Classes
3.2 Referncias
3.3 Objetos (ou instncias)
3.4 O processo de construo e destruo de um objeto
3.4.1 Criao de objetos
3.4.2 Destruio de Objetos e o Garbage Collector
3.4.3 Tabela interna de referncias
3.4.4 LIKE REF TO
3.5 Atributos
3.6 Mtodos
4 Conceitos intermedirios
4.1 Construtores
4.1.1 Construtor de Instncia
4.1.2 Construtor esttico (ou de classe)
4.2 Autoreferncia me
4.3 Sesses de visibilidade
4.3.1 PUBLIC SECTION
4.3.2 PRIVATE SECTION
4.4 Atributos e Mtodos de Instncia vs Estticos
1 Prefcio
Este livro foi criado no ano de 2016 para tentar solucionar um problema
que deveria na opinio do autor ter sido resolvido por volta de uma
dcada antes: o problema de ainda haver desenvolvedores ABAP sem o
conhecimento necessrio em orientao a objetos para exercer com
sucesso suas atividades no diaadia.
Adquirir tal conhecimento talvez tenha sido opcional ou mais do que o
suficiente em certa poca, mas se voc est lendo este prefcio deve
compartilhar da minha opinio que este tempo j passou.
Claro que h muitos desenvolvedores ABAP que alegam no precisar de
orientao objetos para realizarem seus trabalhos. Eles provavelmente
sempre implementaram BAdIs sem ter total convico do que estavam
fazendo e acabaram tratando problemas que a orientao a objetos
elementar resolve de maneira simples usando artifcios quase
indecifrveis em termos de lgica. Quem diz isso algum que j viu os
comandos EXPORT e IMPORT sendo usados para transferir dados do
mesmo objeto simplemente por estarem em diferentes mtodos.
Mas mesmo que tal pessoa nunca tenha tido dificuldades para
implementar BAdIs, ser que esta pessoa recebe outros tipos de
demanda das 8 as 5? Ser que ela alocada em projetos que envolvem
coisas diferentes ou modernas e at mesmo obrigatrias para quem quer
se considerar um desenvolvedor ABAP srio?
A ideia deste livro de no esgotar os exemplos. Falo de demandas e
projetos que envolvem Enhancements Framework, Workflow, PI, Web
Dynpro, FPM, SAP Gateway (necessrio ou no por conta do Fiori), BOPF,
CRM, BRF+, HANA, etc. Certamente Orientao a Objetos (ou
Esta boa prtica permite que deixemos o cdigo mais legvel, adaptvel e
reutilizvel.
Legvel pois fica fcil saber o que a funo espera de ns para que
ela funcione.
Adaptvel pois no precisamos alterar algo que est fora da funo
para poder alterar o seu comportamento
Reutilizvel pois podemos passar os mesmos parmetros em
diferentes lugares para ter o mesmo efeito. Tais lugares podem ser
simplesmente diferentes pontos na mesma aplicao (bom cenrio
para rotinas locais) ou at em aplicaes diferentes (bom cenrio
para o uso de mdulos de funo).
possvel no declarar parmetros em uma rotina local e usar tipos e
variveis definidos fora dela e ter um programa funcional. possvel
tambm que uma pessoa tenha a capacidade de lamber seus prprios
cotovelos. Geralmente a reao de uma outra pessoa ao ver qualquer um
dos casos anteriores a mesma.
2.3.4 Encapsulamento
Apesar de ser um termo constantemente usado na orientao a objetos, o
mundo procedural tambm prov encapsulamento. Um report que chama
uma funo de seleo de dados no precisa conhecer nada alm dos
parmetros necessrios para fazer a chamada. Se internamente a funo
faz 1 ou 15 SELECTs no possvel descobrir lendo somente o trecho de
cdigo do programa que contm a instruo CALL FUNCTION.
System
defined
Include
files
.
*
*******************************************************************
INCLUDELZOO_FGTOP
.
"GlobalData
INCLUDELZOO_FGUXX
.
"FunctionModules
10
User
defined
Include
files
(
if
necessary
).
*
*******************************************************************
*
INCLUDELZOO_FGF
...
"Subroutines
*
INCLUDELZOO_FGO
...
"PBOModules
*
INCLUDELZOO_FGI
...
"PAIModules
*
INCLUDELZOO_FGE
...
"Events
*
INCLUDELZOO_FGP
...
"Localclassimplement.
*
INCLUDELZOO_FGT99
.
"ABAPUnittests
POOLzoo_fg
.
"MESSAGEID..
*
INCLUDELZOO_FGD
...
"Localclassdefinition
DATAv_countTYPEi.
Include LZOO_FGTOP
O primeiro mdulo de funo simplesmente incrementa o valor da
varivel
v_count
.
FUNCTIONZ_OO_INCREMENT_COUNTER.
ADD
1
TOv_count.
ENDFUNCTION.
11
FUNCTIONZ_OO_GET_COUNTER
EXPORTING
EX_COUNTTYPEI.
ex_count
=
v_count.
ENDFUNCTION.
12
DATAcurrent_valueTYPEi.
DO
5
TIMES.
CALLFUNCTION
'Z_OO_GET_COUNTER'
IMPORTING
ex_count
=
current_value.
WRITE
/
current_value.
CALLFUNCTION
'Z_OO_INCREMENT_COUNTER'.
ENDDO.
Programa ZOO_FG_CALLER
DESAFIO !!!
Voc consegue imaginar qual seria a sada do programa?
Opo 1
0
0
0
0
0
Opo 2
0
1
2
3
4
Opo 3
0
1
0
1
0
Tais variveis poderiam ser acessadas por telas e outros includes definidos no grupo de funo, caso
existissem.
2
13
Resposta:
Voc acertou se respondeu a opo 2. Enquanto a opo 3 no
faz sentido algum, compreensvel caso voc tenha achado que a opo
1 seria a correta. Note que todas as opes comeam imprimindo zero. A
dvida comea quando tentamos entender o que acontece em memria
uma vez que nossa aplicao cai na segunda ocorrncia da instruo DO.
Para entender, vamos representar graficamente a aplicao chamando
nossos mdulos de funo.
14
15
16
3 Conceitos bsicos
preciso entender que a orientao a objetos no muda as demandas que
j temos como desenvolvedor, ela simplesmente muda a forma como as
entregamos.
Comearemos na orientao a objetos esclarecendo seus principais
conceitos. importante ter clara a definio de cada um deles antes de
pensar como seria uma aplicao ABAP orientada a objetos resolvendo um
problema real.
3.1 Classes
Comparado ao mundo procedural, uma classe seria o mais prximo de um
grupo de funes. Todavia existem muitas diferenas. Para evitar
comparaes num nvel tcnico, tentarei deixar a apresentao deste
importante conceito um pouco mais ldica.
Eu sou uma pessoa que gosta de bolos. Chocolate, cenoura, morango
no importa. verdade que cada bolo tem suas caractersticas mas para
se fazer um bolo, independente de como ele seja, preciso de uma
forma que, obviamente, define a forma que os bolos sero.
A relao que quero estabelecer entre a forma de bolo e as classes no
sentido de ser necessrio somente uma forma para se fazer uma
quantidade enorme de bolos. Da mesma forma, com uma classe possvel
criar uma quantidade enorme de objetos.
Ao passo que uma forma redonda s permitir fazermos bolos redondos e
portanto semelhantes entre si, uma classe s permite criar objetos
tambm semelhantes entre si.
17
ENDCLASS.
Exemplo de classe
Muitos comandos podem estar contidos entre o bloco de cdigo acima. O
que temos por hora uma classe o mais simples possvel no ABAP.
As diferenas com grupos de funo j comeam nesta simples classe.
Primeiramente, usamos o nome de classes no cdigo fonte. No caso acima
usamos para
criar
a classe mas depois veremos que tambm usamos tal
nome para
usar
a classe.
Falando em nomes de classes, a regra noescrita
dar bons nomes a tudo
que se cria
continua valendo. Uma classe representa algo. Mesmo que
sendo um conceito abstrato, representa um conceito acima de tudo. Por
isso, comum encontrarmos substantivos sendo usados para nomear
classes.
No que se refere a convenes de cdigo, o prefixo l
cl
bastante usado.
18
3.2 Referncias
Agora que temos uma classe o mais bsica possvel, precisamos saber o
que possvel fazer com ela e a resposta para este caso : no muito.
Conforme dito antes, uma classe como se fosse uma forma de bolo.
Para fazer o bolo precisamos usar as mos: independente se for para
quebrar os ovos e batlos ou para abrir a caixa com o bolo em p pronto.
Tal analogia usada aqui para ilustrar o que so referncias.
Uma referncia como uma mo que segura um (e somente um) bolo. A
nossa mo pode no estar segurando um bolo e do mesmo modo uma
referncia pode no estar com objeto algum.
Uma vez que tenhamos posse de uma forma (classe), usamos nossas mos
para enchermos a forma quantas vezes quisermos.
Da mesma maneira que uma forma de bolo pode ser usada por diversas
pessoas, precisamos declarar quais mos manipularo quais formas.
DATA
:
r_ordem_aTYPEREFTOlcl_ordem_de_venda,
r_ordem_bTYPEREFTOlcl_ordem_de_venda,
r_ordem_cTYPEREFTOlcl_ordem_de_venda,
r_ordem_dLIKEr_ordem_c.
Referncias a classes
No se confunda. No exemplo acima temos quatro
referncias e no
quatro objetos. Uma das principais dificuldades para iniciantes no assunto
da orientao a objeto diferenciar estes conceitos.
19
DATA
:
v_iTYPEi,
v_stringTYPE
string,
v_num_10TYPEnumc10,
waTYPEsyst,
itabTYPEtt_mara.
20
POINT
.
"Debugapartirdaqui
v_i
=
10.
v_string
=
'OrientaoaObjetos'.
v_num_10
=
'01234'.
wa
=
sy.
SELECT
*
FROMmaraINTOTABLEitab.
21
DATA
:
r_iTYPEREFTOi,
22
BREAK
POINT
.
"Debugapartirdaqui
CREATEDATA:
r_i,
r_string,
r_num_10,
r_wa,
r_itab.
r_i
>*
10.
r_string
>*
'OrientaoaObjetos'.
r_num_10
>*
'01234'.
r_wa
>*
=
sy.
SELECT
*
FROMmaraINTOTABLEr_itab
>*.
23
24
Checkbox REF TO
Em diversas transaes de desenvolvimento, existe um checkbox chamado
REF TO, justamente que define se o que est sendo criada um
tipo/varivel simples ou uma referncia a algo.
25
r_ordem_c
=
NEWlcl_ordem_de_venda
(
).
Criao de objetos
Caso esteja usando uma verso do NetWeaver de meados de 2012,
possvel criar uma referncia e um objeto para ela na mesma linha de
cdigo muito semelhante como o que feito em Java.
DATA
(
r_ordem_e
)
=
NEWlcl_ordem_de_venda
(
).
26
27
ENDCLASS.
DATA
:
r_ordem_aTYPEREFTOlcl_ordem_de_venda,
r_ordem_bTYPEREFTOlcl_ordem_de_venda,
r_ordem_cTYPEREFTOlcl_ordem_de_venda,
r_ordem_dLIKEr_ordem_c.
28
Vamos criar nosso primeiro objeto. J sabemos que para criar um objeto
precisamos de uma referncia.
CREATEOBJECTr_ordem_a.
29
r_ordem_b
=
NEWlcl_ordem_de_venda
(
).
30
Reposta:
A resposta para tal desafio se resume a lembrar que as
referncias guardam endereos de memria que no fundo so nmeros.
Imaginando que a referncia r_ordem_b guarda o endereo de memria
548, estamos copiando tal valor para a referncia r_ordem_c. O resultado
de copiar o endereo de memria NO o mesmo de copiar o objeto.
Logo, a resposta abaixo est incorreta.
31
32
33
34
35
DATAr_ordemTYPEREFTOlcl_ordem_de_venda.
CREATEOBJECTr_ordem.
APPENDr_ordemTOt_r_ordens.
36
3.5 Atributos
At o momento a definio de nossa classe (CLASS DEFINITION
ENDCLASS.) se manteve vazia. Contdo conforme dito anteriormente,
classes nada mais so que tipos complexos. Digase de passagem, muito
mais complexos que um mero BEGIN OF.. END OF pode fazer em uma
work area
.
Um atributos basicamente se resumem a declaraes de variveis
colocadas entre o bloco CLASS DEFINITION ENDCLASS.
37
Tudo que voc j sabe sobre o comando DATA pode ser aplicado neste
contexto. possvel usar tipos primitivos, do dicionrio, clusula LIKE,
definio de work areas e tabelas internas e assim por diante.
possvel tambm usar tipos (TYPES) e constantes (CONSTANTS) dentro
do bloco CLASS DEFINITION.
Veja o exemplo abaixo.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.
TYPEStt_itemsTYPETABLEOFvbap.
CONSTANTSc_tipoTYPEvbak
auartVALUE
'OR'.
DATA
:
valorTYPEpLENGTH
10
DECIMALS
2,
idTYPEvbeln_va,
headerTYPEvbak,
itemsTYPEtt_items.
ENDCLASS.
38
39
40
Trs objetos do mesmo tipo criados: cada objeto possui seus prprios
dados
No exemplo acima, temos trs referncias a classe lcl_ordem_de_venda
sendo que cada uma aponta para um objeto distinto j criado.
41
CREATEOBJECTr_ordem_a.
r_ordem_a
>
id
=
'1234'.
r_ordem_a
>
valor
=
1000.
r_ordem_a
>
valor
=
r_ordem_a
>
valor
100.
r_ordem_a
>
header
vbeln
=
r_ordem_a
>
id.
APPENDINITIALLINETOr_ordem_a
>
items.
READTABLEr_ordem_a
>
itemsINDEX
1
INTODATA
(
wa_item
).
LOOPATr_ordem_a
>
itemsASSIGNINGFIELD
SYMBOL
(<
item
>).
WRITE
/
<item>
vbeln.
ENDLOOP.
42
3.6 Mtodos
Objetos no simplesmente podem carregar dados em forma de atributos
mas tambm so capazes de processar tais dados. Em outras palavras um
objeto tem a capacidade de possuir cdigo ABAP como selees no banco
de dados, leitura de arquivos, chamadas a funes, exibies de telas,
etc.
Tais instrues so encapsuladas em
mtodos
, que podem ser comparados
a mdulos de funo no sentido de possurem parmetros de entrada e
sada, tratamento de erros, alm do cdigo em si.
Por infelicidade do destino, quando a SAP definiu qual seria a sintaxe dos
comandos de orientao a objetos, os comandos relacionados a mtodos
talvez no tiveram uma ateno to especial. O resultado disso que
uma vez que sua classe tenha mtodos (o que tipicamente vai ocorrer)
sua classe ir crescer em nmero de linhas de cdigo.
No ABAP, separase a declarao da implementao de uma classe. A
parte de declarao define basicamente os atributos e mtodos da classe
enquanto a parte de implementao conter o cdigo que pode ser
depurado. Tais trechos de cdigo estaro
sempre dentro da
43
"Declaraodeatributos(...)
ENDCLASS.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.
ENDCLASS.
TYPEStt_itemsTYPETABLEOFvbap.
CONSTANTSc_tipoTYPEvbak
auartVALUE
'OR'.
DATA
:
valorTYPEpLENGTH
10
DECIMALS
2,
idTYPEvbeln_va,
headerTYPEvbak,
itemsTYPEtt_items.
METHODSfazer_absolutamente_nada.
ENDCLASS.
Declarao de mtodo
44
METHODfazer_absolutamente_nada.
BREAK
POINT.
ENDMETHOD.
ENDCLASS.
Implementao de mtodo
O comando BREAKPOINT aqui ajuda a validarmos se o mtodo pode
realmente ser chamado.
Como os mtodos declarados neste cenrio pertencem aos objetos e
somente possvel usar os objetos atravs das referncias que apontam a
eles, precisamos tambm das referncias para chamar tais mtodos.
DATAr_ordem_aTYPEREFTOlcl_ordem_de_venda.
"Opo1)Semelhanteachamadademdulosdefuno
CALLMETHODr_ordem_a
>
fazer_absolutamente_nada.
"Opo2)Semelhanteaoutraslinguagensorientadaaobjetos
r_ordem_a
>
fazer_absolutamente_nada
(
).
Chamadas de mtodos
45
4 Conceitos intermedirios
Estamos cada pargrafo mais longe no mar da orientao a objetos.
hora de estudar conceitos que dificilmente podem ser associados com o
mundo procedural. Esteja aberto a novas formas de escrever cdigo a
partir de agora.
4.1 Construtores
Diferente de outras linguagens orientadas a objetos, o ABAP no permite
que haja mais de um mtodo na mesma classe com o mesmo nome.
Construtores so mtodos especiais pois so chamados automaticamente
em momentos bem especficos. Existem dois tipos de mtodos
construtores, que so identificados pelo seu nome reservado.
46
ENDCLASS.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.
METHODconstructor.
ENDMETHOD.
ENDCLASS.
Constructor de instncia
47
CLASSlcl_ordem_de_vendaDEFINITION
.
PUBLICSECTION
.
CLASS
METHODSclass_constructor
.
ENDCLASS
.
CLASSlcl_ordem_de_vendaIMPLEMENTATION
.
METHODclass_constructor
.
ENDMETHOD
.
ENDCLASS.
Construtor de classe
Uma maneira simples de diferenciar quando cada um dos construtores so
chamados depurando o programa abaixo.
REPORTzoo_construtores.
CLASSlcl_ordem_de_vendaDEFINITION.
PUBLICSECTION.
METHODSconstructor.
CLASS
METHODSclass_constructor.
ENDCLASS.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.
METHODconstructor.
BREAK
POINT.
ENDMETHOD.
METHODclass_constructor.
BREAK
POINT.
ENDMETHOD.
ENDCLASS.
DATAr_ordemTYPEREFTOlcl_ordem_de_venda.
START
OF
SELECTION.
48
CREATEOBJECTr_ordem.
CREATEOBJECTr_ordem.
CREATEOBJECTr_ordem.
4.2 Auto-referncia me
Uma vez compreendida a diferena entre os construtores, chegou a hora
de entender o conceito de autoreferncia.
A
autoreferncia uma referncia chamada me declarada
implicitamente (obviamente usando a vario REF TO) acessvel dentro
de blocos METHOD ENDMETHOD e portanto pode ser usada somente
dentro de implementaes de classes.
Um caso de uso tpico da autoreferncia me dentro do construtor de
instncia. Veja o cdigo abaixo.
CLASSlcl_employeeDEFINITION.
PUBLICSECTION.
TYPESty_pernrTYPEpa0002
pernr.
DATApernrTYPEty_pernr.
METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.
ENDCLASS.
49
CLASSlcl_employeeIMPLEMENTATION.
METHODconstructor.
me
>
pernr
=
i_personal_number
.
"
auto
refer
ncia
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.
START
OF
SELECTION.
CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=
'50000000'.
r_employee_2
=
NEWlcl_employee
(
i_personal_number
=
'50000001'
).
"Hasomenteumparametrodeentrada
r_employee_3
=
NEWlcl_employee
(
'50000002'
).
WRITE:
|
1
{
r_employee_1
>
pernr
}|,
/,
|
2
{
r_employee_2
>
pernr
}|,
/,
|
3
{
r_employee_3
>
pernr
}|.
50
TYPESty_pernrTYPEpa0002
pernr.
DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.
METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.
METHODSload_personal_data.
METHODSwrite_personal_data.
ENDCLASS.
CLASSlcl_employeeIMPLEMENTATION.
METHODconstructor.
me
>
pernr
=
i_personal_number.
me
>
load_personal_data
(
).
"
chamadausando
auto
refer
ncia
ENDMETHOD.
METHODload_personal_data.
SELECT
*
UPTO
1
ROWS
51
refer
ncia
WHERE
pernr
=
me
>
pernr
"
lendoa
auto
refer
ncia
ORDERBYenddaDESCENDING.
ENDSELECT.
ENDMETHOD.
METHODwrite_personal_data.
"
Leitura
dosatributosparaimpressaousando
auto
refer
ncia
WRITE
:
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.
START
OF
SELECTION.
CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=
'50000000'.
r_employee_2
=
NEWlcl_employee
(
i_personal_number
=
'50000002'
).
r_employee_3
=
NEWlcl_employee
(
'50000003'
).
"Impressao
r_employee_1
>
write_personal_data
(
).
CALLMETHODr_employee_2
>
write_personal_data.
r_employee_3
>
write_personal_data
(
).
52
53
TYPESty_pernrTYPEpa0002
pernr.
DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.
METHODSload_personal_data.
METHODSwrite_personal_data.
ENDCLASS.
CLASSlcl_employeeIMPLEMENTATION.
METHODload_personal_data.
SELECT
*
UPTO
1
ROWS
FROMpa0002
INTOme
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDERBYenddaDESCENDING.
ENDSELECT.
ENDMETHOD.
METHODwrite_personal_data.
WRITE
:
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.
54
OF
SELECTION.
CREATEOBJECTr_employee_1.
r_employee_1
>
pernr
=
'50000000'.
r_employee_2
=
NEWlcl_employee
(
).
r_employee_2
>
pernr
=
'50000002'.
r_employee_3
=
NEWlcl_employee
(
).
r_employee_3
>
pernr
=
'50000003'.
Carrega
dados
do
empregado
r_employee_1
>
load_personal_data
(
).
r_employee_2
>
load_personal_data
(
).
r_employee_3
>
load_personal_data
(
).
Impressao
r_employee_1
>
write_personal_data
(
).
CALLMETHODr_employee_2
>
write_personal_data.
WRITE
:
{
r_employee_3
>
wa_pa0002
pernr
}
{
r_employee_3
>
wa_pa0002
cname
}
|
.
55
56
TYPESty_pernrTYPEpa0002
pernr.
METHODSconstructor
IMPORTING
i_personal_numberTYPEty_pernr.
METHODSwrite_personal_data.
PRIVATESECTION.
DATA
:
pernrTYPEty_pernr,
wa_pa0002TYPEpa0002.
METHODSload_personal_data.
ENDCLASS.
CLASSlcl_employeeIMPLEMENTATION.
METHODconstructor.
me
>
pernr
=
i_personal_number.
Chamada
dem
todoprivado.
*
Como
estamosdentro
do
blocodeimplementa
o
*
isso
permitido
me
>
load_personal_data
(
).
57
ENDMETHOD.
METHODload_personal_data.
SELECT
*
UPTO
1
ROWS
FROMpa0002
INTOme
>
wa_pa0002
WHERE
pernr
=
me
>
pernr
ORDERBYenddaDESCENDING.
ENDSELECT.
ENDMETHOD.
METHODwrite_personal_data.
WRITE
:
{
me
>
wa_pa0002
pernr
}
{
me
>
wa_pa0002
cname
}
|
.
ENDMETHOD.
ENDCLASS.
DATA
:
r_employee_1TYPEREFTOlcl_employee,
r_employee_2TYPEREFTOlcl_employee,
r_employee_3TYPEREFTOlcl_employee.
START
OF
SELECTION.
CREATEOBJECTr_employee_1
EXPORTING
i_personal_number
=
'50000000'.
Erro
desintaxe
atributoprivado
*
r_employee_1
>
permr
=
'50000000'.
r_employee_2
=
NEWlcl_employee
(
i_personal_number
=
'50000002'
).
r_employee_3
=
NEWlcl_employee
(
'50000003'
).
Erro
desintaxe
metodoprivado
*
r_employee_1
>
load_personal_data
(
).
"Impressao
r_employee_1
>
write_personal_data
(
).
CALLMETHODr_employee_2
>
write_personal_data.
58
).
59
wa_pa0002
) sem antes ter preenchido o nmero do empregado o que
no faz sentido. Atributos e mtodos definidos como privados se bem
usados evitam que objetos tenham valores que no fazem sentidos e que
chamadas desnecessrias sejam feitas.
60
DATA
:
languageTYPEmakt
spras.
CLASS
METHODSclass_constructor.
ENDCLASS.
61
METHODclass_constructor.
lcl_material_texts
=>
language
=
'P'.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
WRITE
:
lcl_material_texts
=>
language.
lcl_material_texts
=>
language
=
'E'.
WRITE
:
lcl_material_texts
=>
language.
62
Note que para acessar atributos estticos usamos uma seta ( => ) um
pouco diferente da que estvamos acostumados. Ainda, o termo a
esquerda da seta no uma referncia mas sim o prprio nome da classe.
Assim, alm de no precisarmos criar um objeto, no precisamos tambm
declarar uma referncia para fazer uso de atributos estticos.
Vamos incrementar nosso modelo usando vrios conceitos j abordados,
alm de criar alguns objetos e trabalhar com eles.
CLASSlcl_material_textsDEFINITION.
PUBLICSECTION.
TYPES
:
ty_material_idTYPEmakt
matnr,
ty_material_textTYPEmakt
maktx,
ty_languageTYPEmakt
spras.
CLASS
DATA
:
languageTYPEty_language.
CLASS
METHODSclass_constructor.
METHODSconstructor
IMPORTING
i_matnrTYPElcl_material_texts
=>
ty_material_id.
METHODSselect_text
RETURNINGVALUE
(
re_material_text
)
TYPElcl_material_texts
=>
ty_material_text.
PRIVATESECTION.
DATA
:
matnrTYPEty_material_id
,
"lcl_material_texts=>opcional
material_textTYPElcl_material_texts
=>
ty_material_text,
selected_languageTYPEty_language
.
ENDCLASS.
CLASSlcl_material_textsIMPLEMENTATION.
METHODclass_constructor.
lcl_material_texts
=>
language
=
'P'.
ENDMETHOD.
63
"me>opcional
me
>
material_text
=
me
>
select_text
(
).
ENDMETHOD.
METHODselect_text.
IFme
>
material_textISINITIALOR
lcl_material_texts
=>
language
<>
me
>
selected_language.
SELECTSINGLE
maktx
FROMmakt
INTOre_material_text
WHERE
matnr
=
matnr
"me>opcional
ANDspras
=
lcl_material_texts
=>
language.
IFsy
subrcISINITIAL.
me
>
selected_language
=
lcl_material_texts
=>
language.
me
>
material_text
=
re_material_text.
ENDIF.
ENDIF.
re_material_text
=
me
>
material_text.
ENDMETHOD.
ENDCLASS.
DATA
:
r_material_aTYPEREFTOlcl_material_texts,
r_material_bTYPEREFTOlcl_material_texts.
START
OF
SELECTION.
WRITE
:
|
Textos
em
{
lcl_material_texts
=>
language
}|.
r_material_a
=
NEWlcl_material_texts
(
'RF130'
).
r_material_b
=
NEWlcl_material_texts
(
'RT300'
).
64
),
/,
r_material_b
>
select_text
(
),
/,
NEWlcl_material_texts
(
'MMFUSIVEL30'
)>
select_text
(
).
lcl_material_texts
=>
language
=
'E'.
ULINE.
WRITE
:
/
r_material_a
>
select_text
(
),
/,
r_material_b
>
select_text
(
).
65
'E'.
66
67
4.5 Herana
comum termos a possibilidade de reutilizar um trecho de cdigo, seja
tal reuso vlido dentro da aplicao ou feito em vrios programas
distintos.
Tambm frequente termos a necessidade de adaptar alguns pequenos
detalhes alm de ser fazer reuso de um trecho de cdigo.
A
herana uma maneira que a orientao a objetos prov de reutilizar
cdigo entre classes que so semelhantes.
Acompanhe o seguinte exemplo. No mdulo de SD, temos vrios tipos de
documentos diferentes. Dois documentos bem famosos so a cotao e a
ordem de venda.
Ambos documentos possui muito em comum: cabealho, itens, preos,
quantias. O cabealho destes dois tipos de documentos so armazenados
na mesma tabela: VBAK.
Uma das diferenas tcnicas destes documentos a transao usada para
exibir tal documento. Para exibir cotaes usase a transao VA23
68
REPORTzoo_heranca.
CLASSlcl_documento_de_vendaDEFINITION.
PUBLICSECTION.
TYPES:
ty_idTYPEvbak
vbeln,
ty_headerTYPEvbak.
METHODSconstructor
IMPORTING
i_idTYPEty_id.
METHODSabrir.
DATAheaderTYPEty_header.
PRIVATESECTION.
METHODSselect_header
RETURNINGVALUE
(
re_header
)
TYPEty_header.
ENDCLASS.
CLASSlcl_documento_de_vendaIMPLEMENTATION.
METHODconstructor.
me
>
header
vbeln
=
i_id.
me
>
header
=
me
>
select_header
(
).
ENDMETHOD.
METHODselect_header.
69
SELECTSINGLE*
FROMvbak
INTOre_header
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
METHODabrir.
SETPARAMETERID
'AUN'
FIELDheader
vbeln.
ENDMETHOD.
ENDCLASS.
CLASSlcl_cotacaoDEFINITION
INHERITINGFROMlcl_documento_de_venda.
PUBLICSECTION.
METHODSabrirREDEFINITION.
ENDCLASS.
CLASSlcl_cotacaoIMPLEMENTATION.
METHODabrir.
super
>
abrir
(
).
callTRANSACTION
'VA23'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.
ENDCLASS.
CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento_de_venda.
PUBLICSECTION.
METHODSabrirREDEFINITION.
ENDCLASS.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.
70
super
>
abrir
(
).
callTRANSACTION
'VA03'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
DATA
:
r_cotacaoTYPEREFTOlcl_cotacao.
createOBJECTr_cotacao
EXPORTING
i_id
=
'0020000162'.
r_cotacao
>
abrir
(
).
new
lcl_ordem_de_venda
(
i_id
=
'0000016197'
)>
abrir
(
).
Aplicao de herana
No exemplo acima, temos trs classes:
A nossa classe me
lcl_documento_de_venda,que possui cdigo a
ser reutilizado pois comum a ambos os documentos.
A classe filha
lcl_cotacao
, que exibe uma cotao na transao
VA23
A classe filha
lcl_ordem_de_venda
, que exibe uma venda na
transao VA03
Todos os atributos e mtodos pblicos so
herdados
para as classes filhas.
Isso significa que o mtodo
select_header pode apenas ser chamado na
nossa classe me.
Para tornar uma classe filha de outra necessrio adicionar a variao
INHERITING FROM na definio da classe filha. No h limite para o
71
nmero de classes filhas que uma classe pode ter. Ainda, uma classe pode
apenas ter uma e somente me.
Podese no exemplo reutilizar o mtodo
abrir da classe me, que
simplesmente preenche o ID de parmetro necessrio para abrir qualquer
um dos dois documentos de venda.
TYPES:
ty_idTYPEvbak
vbeln,
72
METHODSconstructor
IMPORTING
i_idTYPEty_id.
METHODSabrir.
DATAheaderTYPEty_header.
PROTECTEDSECTION
.
"Protegida!
METHODSselect_header
"mtodoserherdado
RETURNINGVALUE
(
re_header
)
TYPEty_header.
PRIVATESECTION.
ENDCLASS.
CLASSlcl_documento_de_vendaIMPLEMENTATION.
METHODconstructor.
me
>
header
vbeln
=
i_id.
ENDMETHOD.
METHODselect_header.
SELECTSINGLE*
FROMvbak
INTOre_header
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
METHODabrir.
SETPARAMETERID
'AUN'
FIELDheader
vbeln.
ENDMETHOD.
ENDCLASS.
CLASSlcl_cotacaoDEFINITION
INHERITINGFROMlcl_documento_de_venda.
73
ENDCLASS.
CLASSlcl_cotacaoIMPLEMENTATION.
METHODabrir.
me
>
header
=
me
>
select_header
(
).
MESSAGE
|
Cota
o
do
tipo
{
me
>
header
auart
}
|
TYPE
'I'.
super
>
abrir
(
).
CALLTRANSACTION
'VA23'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.
ENDCLASS.
CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento_de_venda.
PUBLICSECTION.
TYPES
:
ty_itemsTYPETABLEOFvbap.
DATAt_itemsTYPEty_itemsREAD
ONLY.
METHODSconstructor
IMPORTING
i_id_vendaTYPElcl_documento_de_venda
=>
ty_id.
METHODSabrirREDEFINITION.
PRIVATESECTION.
METHODSselect_items.
ENDCLASS.
CLASSlcl_ordem_de_vendaIMPLEMENTATION.
METHODconstructor.
super
>
constructor
(
i_id
=
i_id_venda
).
me
>
select_items
(
).
ENDMETHOD.
74
METHODabrir.
DATAno_linhasTYPEi.
super
>
abrir
(
).
DESCRIBETABLEme
>
t_itemsLINESno_linhas.
MESSAGE
|
Ordem
possui
{
no_linhas
}
itens
|
TYPE
'I'.
CALLTRANSACTION
'VA03'
ANDSKIPFIRSTSCREEN.
ENDMETHOD.
METHODselect_items.
SELECT*
FROMvbap
INTOTABLEme
>
t_items
WHERE
vbeln
=
me
>
header
vbeln.
ENDMETHOD.
ENDCLASS.
START
OF
SELECTION.
DATA
:
r_cotacaoTYPEREFTOlcl_cotacao.
CREATEOBJECTr_cotacao
EXPORTING
i_id
=
'0020000162'.
r_cotacao
>
abrir
(
).
NEWlcl_ordem_de_venda
(
i_id_venda
=
'0000016197'
)>
abrir
(
).
75
4.6 Eventos
Com evento, possvel realizar a comunicao entre dois objetos de uma
maneira mais sofisticada que simplemente chamar um mtodo de um
objeto dentro de outro objeto. Isso pois possvel que um objeto
dispare um evento e automaticamente vrios outros objetos reajam a
este.
Este conceito muito til quando em algum ponto da aplicao, vrios
procedimentos, checagens, contas, validaes precisam ser feitas de
maneira independente uma das outras.
Ao trabalhar com eventos, sempre haver 4 passos que obrigatoriamente
iro ser realizados.
76
1 Criao do evento
Um evento criado no bloco de definio da classe que possuir o
evento. Tal procedimento realizado usando o comando EVENTS
CLASSlcl_documentos_fiDEFINITION.
PUBLICSECTION.
EVENTS
:
documentos_selecionados.
(...)
2 Disparo do evento
O disparo do evento deve ser feito pelo mesmo objeto que possui o
evento. Isto feito atravs do comando RAISE EVENT.
METHODselect_documents.
(...)
RAISEEVENTdocumentos_selecionados.
(...)
ENDMETHOD.
77
OF
SELECTION.
DATA
(
r_relatorio
)
=
NEWlcl_relatorio
(
).
SETHANDLERr_relatorio
>
captura_documentosFORALLINSTANCES.
78
PUBLICSECTION.
EVENTS
:
documentos_selecionados.
TYPES:
ty_empresaTYPEbkpf
bukrs,
ty_data_lancamentoTYPERANGEOFbkpf
budat,
BEGIN
OFty_key,
bukrsTYPEbkpf
bukrs,
belnrTYPEbkpf
belnr,
gjahrTYPEbkpf
gjahr,
END
OFty_key,
BEGIN
OFty_header.
INCLUDETYPEty_key.
TYPES
:
budatTYPEbkpf
budat,
END
OFty_header,
BEGIN
OFty_item.
INCLUDETYPEty_key.
TYPES
:
buzeiTYPEbseg
buzei,
shkzgTYPEbseg
shkzg
,
"Debito/Credito
79
dmbtr
,
"Valor
END
OFty_item,
tt_headersTYPEHASHEDTABLEOFty_header
WITHUNIQUEKEYbukrsbelnrgjahr,
tt_itemsTYPESORTEDTABLEOFty_item
WITHUNIQUEKEYbukrsbelnrgjahrbuzei.
DATA:
v_empresaTYPEty_empresaREAD
ONLY,
t_ra_data_lancamentoTYPEty_data_lancamentoREAD
ONLY,
t_headersTYPEtt_headersREAD
ONLY,
t_itemsTYPEtt_itemsREAD
ONLY.
METHODSconstructor
IMPORTING
iv_bukrsTYPEty_empresa
it_ra_budatTYPEty_data_lancamento.
PRIVATESECTION.
METHODSselect_documents.
METHODSselect_headers
RETURNINGVALUE
(
re_headers
)
TYPEtt_headers.
METHODSselect_items
IMPORTING
it_headersTYPEtt_headers
RETURNINGVALUE
(
re_documentos
)
TYPEtt_items.
ENDCLASS.
CLASSlcl_documentos_fiIMPLEMENTATION.
METHODconstructor.
me
>
v_empresa
=
iv_bukrs.
me
>
t_ra_data_lancamento
=
it_ra_budat.
me
>
select_documents
(
).
ENDMETHOD.
METHODselect_documents.
80
).
RAISEEVENTdocumentos_selecionados.
ENDMETHOD.
METHODselect_headers.
SELECT
bukrs
belnr
gjahr
budat
FROMbkpf
INTOTABLEre_headers
WHERE
bukrs
=
me
>
v_empresa
ANDbudatINme
>
t_ra_data_lancamento.
IFsy
subrcISINITIAL.
me
>
t_headers
=
re_headers.
ENDIF.
ENDMETHOD.
METHODselect_items.
SELECT
bukrs
belnr
gjahr
buzei
shkzg
dmbtr
FROMbseg
INTOCORRESPONDINGFIELDSOFTABLEre_documentos
FORALLENTRIESINit_headers
WHERE
bukrs
=
it_headers
bukrs
ANDbelnr
=
it_headers
belnr
ANDgjahr
=
it_headers
gjahr.
81
ENDCLASS.
acima
que
possui
um
chamado no
evento chamado
final do mtodo
Os objetos do tipo
lcl_documentos_fi portanto disparam seus eventos.
Criaremos agora a segunda classe que reagir ao evento em questo.
Alm disso, tal classe possui outros eventos usados nela internamente.
CLASSlcl_contador_relatorioDEFINITION.
PUBLICSECTION.
METHODScaptura_documentos
FOREVENTdocumentos_selecionadosOF
lcl_documentos_fi
IMPORTINGsender.
METHODSpercorre_itens.
DATAv_totalTYPElcl_documentos_fi
=>
ty_item
dmbtrREAD
ONLY.
DATA
:
BEGIN
OFwa_total_periodoREAD
ONLY,
primeiroTYPElcl_documentos_fi
=>
ty_item
dmbtr,
segundoTYPElcl_documentos_fi
=>
ty_item
dmbtr,
END
OFwa_total_periodo.
DATAv_quantidade_itensTYPEiREAD
ONLY.
PRIVATESECTION.
DATAr_documentosTYPEREFTOlcl_documentos_fi.
DATAv_metade_periodoTYPEd.
82
METHODScalcula_total
FOREVENTnovo_itemOFlcl_contador_relatorio
IMPORTINGwa_item.
METHODSsoma_periodo
FOREVENTnovo_itemOFlcl_contador_relatorio
IMPORTINGwa_item.
METHODSconta_item
FOREVENTnovo_itemOFlcl_contador_relatorio.
ENDCLASS.
CLASSlcl_contador_relatorioIMPLEMENTATION.
METHODcaptura_documentos.
me
>
r_documentos
=
sender.
DATA
(
lv_delta_days
)
=
(
me
>
r_documentos
>
t_ra_data_lancamento
[
]
high
me
>
r_documentos
>
t_ra_data_lancamento
[
]
low
).
v_metade_periodo=
me
>
r_documentos
>
t_ra_data_lancamento
[
]
low+
(
lv_delta_days
/
).
SETHANDLER:
me
>
calcula_totalFORme,
me
>
soma_periodoFORme,
me
>
conta_itemFORme.
ENDMETHOD.
METHODpercorre_itens.
LOOPATme
>
r_documentos
>
t_itemsINTODATA
(
lwa_item
).
RAISEEVENTnovo_item
EXPORTING
wa_item
=
lwa_item.
ENDLOOP.
83
ENDMETHOD.
METHODcalcula_total.
IFwa_item
shkzg
=
'H'
.
"Credito
me
>
v_total
=
me
>
v_total
+
wa_item
dmbtr.
ENDIF.
ENDMETHOD.
METHODsoma_periodo.
IFwa_item
shkzg
=
'H'
.
"Credito
READTABLEme
>
r_documentos
>
t_headers
WITHTABLEKEY
bukrs
=
wa_item
bukrs
belnr
=
wa_item
belnr
gjahr
=
wa_item
gjahr
ASSIGNINGFIELD
SYMBOL
(<
wa_header
>).
IF
<wa_header>
budat
<
me
>
v_metade_periodo.
me
>
wa_total_periodo
primeiro=
me
>
wa_total_periodo
primeiro
+
wa_item
dmbtr.
ELSE.
me
>
wa_total_periodo
segundo=
me
>
wa_total_periodo
segundo
+
wa_item
dmbtr.
ENDIF.
ENDIF.
ENDMETHOD.
METHODconta_item.
ADD
1
TOme
>
v_quantidade_itens.
ENDMETHOD.
ENDCLASS.
84
PARAMETER:
p_bukrs TYPE bkpfbukrs OBLIGATORY.
DATA v_budat TYPE bkpfbudat .
SELECTOPTIONS:
s_budat FOR v_budat NOEXTENSION OBLIGATORY.
STARTOFSELECTION.
DATA(r_relatorio) = NEW lcl_contador_relatorio( ).
SET HANDLER r_relatorio>captura_documentos FOR ALL INSTANCES.
DATA(r_documentos_fi) = NEW lcl_documentos_fi(
iv_bukrs = p_bukrs
it_ra_budat = s_budat[]
).
r_relatorio>percorre_itens( ).
WRITE:
|Total de crdito: { r_relatorio>v_total }|, /,
|Perodo 1: { r_relatorio>wa_total_periodoprimeiro }|, /
|Perodo 2: { r_relatorio>wa_total_periodosegundo } |,/,
|Quantidade Itens: { r_relatorio>v_quantidade_itens }|.
85
86
CLASSlcx_usuario_inexistenteDEFINITION
INHERITINGFROMcx_static_check.
ENDCLASS.
CLASSlcx_usuario_bloqueadoDEFINITION
INHERITINGFROMcx_static_check.
PUBLICSECTION.
CONSTANTS:
c_mensagemTYPEstringVALUE'Usuriobloqueado'.
ENDCLASS.
Classes de exceo
87
TYPES:
ty_user_nameTYPEusr02
bname,
ty_userTYPEusr02.
CLASS
METHODSseleciona_usuario
IMPORTING
iv_userTYPEty_user_name
RETURNING
VALUE
(
re_user
)
TYPEty_user
RAISING
lcx_usuario_inexistente
lcx_usuario_bloqueado.
ENDCLASS.
CLASSlcl_seletor_usuarioIMPLEMENTATION.
METHODseleciona_usuario.
SELECTSINGLE*
FROMusr02
INTOre_user
WHERE
bname=iv_user.
IFsysubrcISNOTINITIAL.
RAISEEXCEPTIONTYPElcx_usuario_inexistente.
ENDIF.
IFre_useruflagISNOTINITIAL.
RAISEEXCEPTIONTYPElcx_usuario_bloqueado.
ENDIF.
ENDMETHOD.
ENDCLASS.
88
PARAMETERp_userTYPElcl_seletor_usuario
=>
ty_user_nameOBLIGATORY.
START
OF
SELECTION.
TRY.
DATA
(
v_criador
)
=
lcl_seletor_usuario
=>
seleciona_usuario
(
p_user
)
aname.
CATCHlcx_usuario_inexistente.
MESSAGE
'Usurioinexistente'
TYPE
'S'
DISPLAYLIKE
'E'.
STOP.
CATCHlcx_usuario_bloqueado
INTODATA
(
r_erro_user_bloqueado
).
MESSAGEr_erro_user_bloqueado
>
c_mensagem
TYPE
'S'
DISPLAYLIKE
'E'.
STOP.
ENDTRY.
WRITE:
|
Criador
do
usu
rio
{
p_user
}
{
v_criador
}
|.
89
4.8 Interfaces
O termo
interface em orientao a objeto em nada tem a ver com
integrao entre sistemas como muitos se confundem.
Uma interface uma forma de tornar classes no relacionadas entre si
minimamente semelhantes, o que permite por exemplo deixar o cdigo
robusto atravs de uma tcnica conhecida como polimorfismo.
Apesar da herana tambm deixar classes semelhantes entre si, ela
deveria ser usada somente quando uma das classes uma verso
especial da outra. Ainda, no ABAP qualquer classe possui no mximo
uma classe me, enquanto uma interface pode ser usada em vrias
classes ao mesmo tempo que uma nica classe pode se fazer o uso de
vrias interfaces.
Pensemos num caso que sua aplicao precisa criar 3 objetos de negcio
diferentes: um material, uma ordem de venda e um lanamento em
finanas.
Estes trs cadastros so totalmente diferentes entre si, mas h algo que
queremos fazer com todos estes: o cadastramento de fato.
Para tornar nosso cdigo mais legvel, vamos ocultar chamadas de BAPIs e
mdulos de funo que realizam o cadastro efetivamente. Comecemos
pelas nossas 3 classes.
CLASSlcl_materialDEFINITION.
90
CLASSlcl_ordemDEFINITION.
ENDCLASS.
CLASSlcl_lancamentoDEFINITION.
ENDCLASS.
START
OF
SELECTION.
DATA
(
r_material
)
=
NEWlcl_material
(
).
DATA
(
r_ordem
)
=
NEWlcl_ordem
(
).
DATA
(
r_lancamento
)
=
NEWlcl_lancamento
(
).
METHODScriar.
ENDINTERFACE.
CLASSlcl_materialDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.
ENDCLASS.
CLASSlcl_materialIMPLEMENTATION.
91
CLASSlcl_ordemDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.
ENDCLASS.
CLASSlcl_ordemIMPLEMENTATION.
METHODlif_objeto_negocio~criar.
*CALLFUNCTION'Z_CRIA_ORDEM'...
ENDMETHOD.
ENDCLASS.
CLASSlcl_lancamentoDEFINITION.
PUBLICSECTION.
INTERFACESlif_objeto_negocio.
ENDCLASS.
CLASSlcl_lancamentoIMPLEMENTATION.
METHODlif_objeto_negocio~criar.
*CALLFUNCTION'Z_CRIA_LANCAMENTO'...
ENDMETHOD.
ENDCLASS.
Implementao de interface
Com o cdigo acima, poderamos fazer a chamada do mtodo
criar
proveniente da interface sem ao menos saber com qual tipo de objeto
estamos trabalhando.
START
OF
SELECTION.
DATA
(
r_material
)
=
NEWlcl_material
(
).
DATA
(
r_ordem
)
=
NEWlcl_ordem
(
).
DATA
(
r_lancamento
)
=
NEWlcl_lancamento
(
).
DATA
:
t_obj_negocio
TYPETABLEOFREFTOlif_objeto_negocio,
r_obj_negocioTYPEREFTOlif_objeto_negocio.
92
APPENDr_materialTOt_obj_negocio.
APPENDr_ordemTOt_obj_negocio.
APPENDr_lancamentoTOt_obj_negocio.
LOOPATt_obj_negocioINTOr_obj_negocio.
r_obj_negocio
>
criar
(
).
ENDLOOP.
Polimorfismo
93
5 Conceitos Avanados
Conceitos considerados avanados na orientao a objetos no so
difceis de serem entendidos. O principal desafio saber apliclos ou
entendlos em aplicaes para que haja benefcio no desenvolvimento.
5.1 Abstrao
O conceito de abstrao s ser relevante caso sua aplicao trabalhe
com herana. Tanto uma classe como um mtodo podem ser considerados
abstratos.
CLASSlcl_documentoDEFINITIONABSTRACT.
ENDCLASS.
CLASSlcl_ordem_de_vendaDEFINITION
INHERITINGFROMlcl_documento.
ENDCLASS.
CLASSlcl_requisicao_de_compraDEFINITION
INHERITINGFROMlcl_documento.
ENDCLASS.
DATA
:
r_documentoTYPEREFTOlcl_documento
,
"ABSTRATO
r_ordem_de_vendaTYPEREFTOlcl_ordem_de_venda,
r_requisicao_de_compraTYPEREFTOlcl_requisicao_de_compra.
94
START
OF
SELECTION.
r_ordem_de_venda
=
NEWlcl_ordem_de_venda
(
).
r_requisicao_de_compra
=
NEWlcl_requisicao_de_compra
(
).
*
r_documento
=
new
lcl_documento
(
).
"ERRODESINTAXE
r_documento
=
NEWlcl_ordem_de_venda
(
).
Note que ainda possvel usar uma referncia a uma classe abstrata.
Todavia tal referncia ao ser preenchida deve apontar para algum objeto
de classe herdeira e da classe abstrata.
Mtodo abstrato
No caso acima, estamos forando a herana da classe lcl_saida_template
e
a redinio do mtodo
imprimir.
CLASSlcl_saida_templateDEFINITIONABSTRACT.
PROTECTEDSECTION.
METHODSimprimirABSTRACT.
95
CLASSlcl_saida_alvDEFINITION
INHERITINGFROMlcl_saida_template.
PROTECTEDSECTION.
METHODSimprimirREDEFINITION
.
"Obrigatorio
ENDCLASS.
CLASSlcl_saida_alvIMPLEMENTATION.
METHODimprimir.
"exibeALV
ENDMETHOD.
ENDCLASS.
5.2 Final
O conceito de
finalizao
(ou simplesmente o comando FINAL) usado
quando querse
evitar
o uso de herana.
ENDCLASS.
Classe final
96
ENDCLASS.
CLASSlcl_saida_alvIMPLEMENTATION.
METHODformat_columns.
"Unicaimplementacaopossivel
"naopossvelredefinir
"estemtodo
ENDMETHOD.
ENDCLASS.
Mtodo Final
97
PUBLICSECTION.
CLASS
METHODScria_impressora
RETURNINGVALUE
(
re_nova_impressora)
TYPEREFTOlcl_impressora.
ENDCLASS.
CLASSlcl_impressoraIMPLEMENTATION.
METHODcria_impressora.
"criacaodeobjetosspodeacontecer
"dentrodaprpriaclasse
re_nova_impressora
=
NEWlcl_impressora
(
).
ENDMETHOD.
ENDCLASS.
98
99
6 Concluso
Com os conceitos apresentados no livro, voc deve estar apto a se
aventurar nos diversos frameworks ABAP como Web Dynpro, Gateway e
BOPF.
Bons estudos!
100