Professional Documents
Culture Documents
Histrico de Alteraes Data 26/09/2006 01/12/2006 Verso 1.0 2.0 Descrio Treinamento Abap Objects Alteraes e correes Autor Fbio Ferri Fbio Ferri
Sumrio
OBJETIVO INTRODUO AO ABAP OBJECTS ANLISE E DESENVOLVIMENTO PRINCPIOS DA PROGRAMAO ORIENTADA A OBJETO HERENA (INHARITANCE) CASTING INTERFACES EVENTOS CLASSES GLOBAIS E INTERFACES TCNICAS ESPECIAIS MANIPULANDO EXCEES EXERCCIO EXTRA TESTES
Pgina 2 de 191
1. OBJETIVO
Este material tem o objetivo de demonstrar as tcnicas em ABAP na verso 4.7 com programao orientada a objeto. Demonstrando conceitos e exerccios prticos, com o objetivo de iniciar os participantes ao ABAP OBJECTS.
Pgina 3 de 191
Data: 10/05/06
Pgina 4 de 191
Data: 10/05/06
Antes ABAP, SAP utilizavam macro Assembler. ABAP foi criado com a inteno de desenvolver customizaes e enhacements e relatrios. A maioria dos desenvolvedores ABAP, foram influenciados por outras linguagens como PASCAL e COBOL. ABAO Objects uma extenso do ABAP. Abap objects unifica a maiorias dos aspectos de outras linguagens de programao orientada a objeto, como JAVA, C++ e Smalltalk.
Pgina 5 de 191
Caractersticas:
Separao de funes e dados Possibilidade de encapsulamento de funes usando moduralizao Acesso direto aos dados possibilitando visibilidade
Data: 10/05/06
A informao dos sistemas eram previamente definidas pelas funes. Ento dados e funes foram armazenados separadamente e ligados utilizando parmetros.
Pgina 6 de 191
REPORT ZABAP_DEMO *------------------------------------------TYPES: ----DATA: -----PERFORM form1... CALL FUNCTION FB1 CALL FUNCTION FB2
Definies de Tipos Declarao de Dados Programa principal Chamar Subrotinas Chamar funes Definio de Subrotinas
Data: 10/05/06
Uma tpica programao ABAP consiste de declaraes de tipos e dados e lgica de processamento. Para fazer seu programa mais legvel e melhor programao estruturada, recomendado que voc trabalhe em mdulos (unidades encapsuladas com funes) como forms e funes. Estes componentes podem ser reutilizveis.
Pgina 7 de 191
FUNCTION-POOL s_vehicle * Speed uma varivel global * usada no function-pool DATA: speed TYPE I. FUNCTION INC_SPEED add imp_speed TO speed. ENDFUNCTION FUNCTION DEC_SPEED subtract imp_speed TO speed. ENDFUNCTION FUNCTION GET_SPEED exp_speed = speed. ENDFUNCTION
Data: 10/05/06
O grupo de funo S_VEHICLE prov um usurio ou client com servios inc_speed, dec_speed, e get_speed. O grupo de funo faz uma interface para acessar internamente um componente chamado speed.
Pgina 8 de 191
REPORT zvehicledemo. TYPES: .... DATA: wa_car TYPE ... * Sem acesso direto a speed * Uso de funo de pool CALL FUNCTION INC_SPEED CALL FUNCTION DEC_SPEED
inc_speed
CALL FUNCTION GET_SPEED
dec_speed get_speed
Data: 10/05/06
Pgina 9 de 191
Exibir o nmero de veculos e suas velocidades, somente possvel chamando diversas vezes a mesma funo
Data: 10/05/06
Se o programa principal est trabalhando com diversos veculos, isto no possvel sem programao extra.
Pgina 10 de 191
speed
speed
speed
Data: 26/09/06
A habilidade de criar mltiplas instancias de uma classe, como a vehicle, um dos principais caractersticas de linguagens orientadas a objeto.
Pgina 11 de 191
Modelos de Programa o
Modelos de objetos como abstrao do mundo real Dados
Funes Funes
Dados
Dados
Funes Funes
Funes
Dados
Funes
Funes Funes
Funes
Data: 26/09/06
o o o
A parte esquerda do slide mostra que, com a forma procedural, dados e funes so: Criados separadamente Armazenados separadamente Ligados com parmetros As cpsulas a direita em vermelho e branco contm os dados e seus comportamentos na prpria cpsula. Objetos permitem um melhor desenho no modelo de software, refletindo melhor o mundo real.
Pgina 12 de 191
Mundo real
Objetos so abstraes do mundo real Objetos so unidades que representam dados e fun es Melhora a estruturas de software Reduo de custo de manuteno
Data: 26/09/06
Na programao OO dados e funes so desenvolvidas juntamente. Onde o foco de desenvolvimento representar coisas do mundo real. A principais caractersticas so a organizaes dos dados(Atributos) e mtodos(funes) . Consistncia atravs processos de desenvolvimento de software: A linguagem usada em vrias fazes do desenvolvimento ( Analises, Especificao, Desenvolvimento e Implementao) uniforme. O poder desse conceito: - Implementao dos processos prximos ao negcio, melhor envolvimento entre modelador e desenvolvedor. - Melhora a estrutura e manuteno de software e reduz o trabalho requerido.
Pgina 13 de 191
Modelos de Programa o
Dados
Funes Funes
Super Classes
Sub Classe1
Subr Classe 2
Data: 26/09/06
Encapsulamento: Encapsulamento uma implementao de um objeto que est oculto para outros objetos. Somente permitindo alguns funes(aes) que esto permitidas para os objetos externos. Dois bons exemplos de objetos encapsulados so (BOR Bussiness Objetc Repository, utilizados em Workflow, LSMW) e o outro so as BAPIs Bussiness Aplpication Program Interfaces). Polimorfismo: Polimorfismo habilidade de programao em mltiplas formas em OO. Isto significa que diferentes (Classes e Mtodos) reagem de diferentes formas de acordo com definio de sua classe(implementao) . Herana: Herana define a implementao de relacionamento das classes. Onde sero definidas as hierarquias de SuperClasses e SubClasses. OBS: Em Abap Objetcs somente permitido simples herana. No possvel fazer herana mltipla.
Pgina 14 de 191
Desenho e Compatibilidade
* Classe ABAP DATA: cont TYPE n. CLASS lcl_car .... ENDCLASS CREATE OBJECT .... CONT = CONT + 1.
Compatibilidade: uma extenso do ABAP Declaraes ABAP Objetcs so usadas em programas ABAP. Classes ABAP contm declaraes de OO e ABAP Desenho: Simples e Fcil Conceitos de OO tem um forte poder de utilizao Aumento de verificaes e validaes e cdigo.
Data: 26/09/06
Abap Objects apenas uma extenso do atual ABAP. Em Abap Objects as declaraes dos tipos so mais criteriosas do que o ABAP. Por que, quando definimos, por exemplos: parmetros de mtodos de interfaces, voc deve declarar os parmetros de forma correta , para que as implementaes das classes possam utilizar est mesma interface. Abap Objects tem um cdigo mais limpo. Pelo fato do cdigo ser mais limpo, em tempo de execuo somente sero executados as verificaes e aes anteriormente definidas.
Pgina 15 de 191
Dados Globais
Funes - FM
FUNCTION: SAPMM..
Sesso Interna
Sesso Interna
Data: 26/09/06
Uma das principais caractersticas da Orientao a Objetos unificao de cdigos e utilizao separadamente. No caso o client(o programa) utiliza endereos de objetos(instancias) que acessam as funes encapsuladas. Este conceito prove melhor estrutura de cdigo, reutilizao e melhor manuteno do software.
Pgina 16 de 191
Conceito de Desenvolvimento OO
Requisito de Software
Testes
Desenho e Anlise
Implementao
Data: 26/09/06
Em linguagem de programao orientada a objetos a fase de Anlise e Desenho mais importante, pois as decises devem ser realizadas nesta fase, porque as alteraes na fase implementao podero ser muito crticas ao projeto. Ao contrrio para a metodologia procedural que pode permitir algumas alteraes, sem muito impacto.
Pgina 17 de 191
3. ANLISE E DESENVOLVIMENTO
Anlise e Desenho
Contedo:
Caractersticas dos Objetos Definio de UML Diagrama de Classes Diagrama de Sequncias
Data: 26/09/06
Pgina 18 de 191
Mundo real
lcl_vehicle
lcl_people
Data: 26/09/06
Os objetos no slide acima podem representam diversos tipos de objetos do mundo real. Isto pode ser realizado, descrevendo suas caractersticas (atributos) e suas aes (mtodos). Alguns desses objetos podem ter caractersticas muito similares, exemplos: tipos de carros: carro de passeio, carro de corridas. Objetos similares podem ser agrupados juntamente em classes. Onde cada classe diferenciada com suas caractersticas.
Pgina 19 de 191
Nome da classe
lcl_veh icle -make -modell -price -color +set_make () +display _attributes) ( +increase speed _ ()
Atributos
Mtodos
Data: 26/09/06
UML Unified Model Language Para a UML uma classe representada com um nome, atributos e mtodos. Com a UML, voc pode ter a opo de omitir atributos ou mtodos. Atributos descrevem os dados e caractersticas de um objeto que pode ser armazenados em uma classe. Eles definem o status do objeto. Mtodos descrevem as funes de um objeto. Abap Objetcs Events no esto includos no diagrama de classes.
Pgina 20 de 191
Classes e Objetos
Classes: Descrio das caractersticas de um objeto de forma geral Determina os status dos dados atravs dos atributos e mtodos Objetos(Instancias) : Representao do mundo real Representa a Instancia de uma classe
Dados
Data: 26/09/06
A classe modelo de um objeto( exemplo carro) que tem a mesma estrutura. Cada objeto tem um identificador ( referencia = instancia) que identifica o comportamento para aquele objeto. Cada objeto tem seus especficos valores de forma nica para cada objeto. Exemplo: Dois objetos podem ter os mesmos valores, mas nunca tero a mesma instancia ou referencia.
Pgina 21 de 191
UML
UML Unifeid Model Language um padro global uma linguagem para desenho e nota o, construo, visualizao, documentao de modelos para sistemas de software. Tipos de Diagramas:
Diagrama de classes Diagrama de seqncia Diagrama de Componente Diagrama de Distribuio
Data: 26/09/06
A UML Unified Model Language) um padro aberto modelagem de linguagem. Ela usada para especificao, construo, visualizao e documentao de modelos de softwares, habilitando a comunicao uniforme entre os vrios usurios. UML um padro que padronizado pela OMG ( Object Management Group) desde de setembro de 1997. Voc pode encontrar especificao de UML em: http://www.omg.org UML descreve um nmero de diferentes tipos de diagramas em ordem de diferentes vises de um sistema. Diagrama de Classe demonstra viso de estado do modelo. Diagrama de Seqncia demonstra o relacionamento e chamadas de mtodos entre objetos. Ele enfatiza e seqncia de tempo entre as chamadas de mtodos. Diagrama de Componente mostra organizao e dependncias de componentes. Diagrama de Distribuio representa as dependncias de software e hardware.
Pgina 22 de 191
Diagrama de Classe
lcl _custom er
lcl _car
lcl _truck
lcl _bus
Data: 26/09/06
O diagrama de classe descreve os elementos contidos no modelo e os seus vrios relacionamentos estticos. Existem duas formas bsicas de relacionamentos estticos: - Associao ( por exemplo, um carro de aluguel(rental) e customer e booking. - Generalizao / Especializao ( for exemple, um carro e um nibus so ambas veculos) Em diagrama de classes, classes tambm podem ser exibidas com atributos e mtodos.
Pgina 23 de 191
Associao
Clientes podem alugar diversos carros Um agenda(booking) refere a um customer
lcl_booking 0..* 1
Cardinalidades * ou 0..* 1 1..* 0..1
Data: 26/09/06
lcl_customer
Uma associao descreve um relacionamento semntico entre classes. O relacionamento entre objetos para estas classes conhecido como um object link. Objetc link so consequentemente instancias de uma associao. A associao usualmente o relacionamento entre diferentes classes. Entretanto, uma associao pode ser recursiva, neste caso, a classe poderia ter um relacionamento com ela mesma. Na maioria dos casos, associao de recursividade, so usadas para ligar dois diferentes objetos em uma nica classe. Cada associao tem dois papis. Um para cada direo de associao ( booking -> customer , customer -> booking ). Papis podem ter nomes ( por exemplo: a associao car->reserva pode se chamar reserva) Cada papel tem sua cardinalidade que mostra como muitas instancias que participam neste relacionamento. A multiplicidade o nmero de objetos participando em uma classe que tem um relacionamento com outras classes. UML: - A associao representada pela linha entre os smbolos de classes - A cardinalidade o relacionamento que pode ser exibido para cada fim de linha. - Associao pode ser especificada por uma fcil identificao ( um verbo ou texto curto ) . Este nome escrito em itlico acima da linha e muitos tem um seta para ler a direo. Ambos so opcionais.
Pgina 24 de 191
Agregao e Composio
Agregao: um especial caso de associao, a wholepart. Composio: um especial caso de agregao, um existncia dependncia wholepart.
Smbolo de Agregao
lcl_vehicle 1 0..* lcl_wheel
Data: 26/09/06
Agregao um tipo especial de associao. Agregao descreve um objeto que contem outros ou consiste de outros objetos (whole-part) . Um veculo consiste de rodas. O relacionamento pode ser descrito pelas palavras consiste de ou parte de. UML.: Uma agregao, como uma associao, representada por uma linha entre classes, o qual adicionalmente tem um pequeno losango no fim da linha. O losango sempre agregado ao fim, que , o enquanto objeto fim. Seno a convenes seriam iguais como as associaes. Composio um especial tipo de agregao. Composio descreve o fato que o objeto contido no pode conter uma agregao ( por exemplo, uma reserva de carro no pode existir sem um aluguel( rental ) Diferenas para Agregao: A cardinalidade no lado da agregao somente pode ser uma. Cada parte somente parte de um objeto composto, seno as dependncias existentes poderiam ser contraditrias. A linha do tempo, de partes individuais ligada no agregado: Partes so criadas para qualquer um ou imediatamente depois de um agregado, e eles so destrudos para qualquer um ou imediatamente antes da agregao. UML. Composio: Como agregao, composio exibida como uma linha entre duas classes e marcadas com um pequeno losango no lado do agregado. Entretanto, em contraste para a agregao, o losango preenchido.
Pgina 25 de 191
Agregao e Composio
Especializao
Generalizao
lcl _vehicle
lcl _car
lcl _truck
lcl _bus
Especializao
Generalizao
lc _v h le l e ic
lc _c r l a
lc _tru k l c
lc _b s l u
Data: 26/09/06
UML.: Generalizao e Especializao so denotadas por linhas com setas que apontam as classes subordinadas para as superclasses. Diversas linhas podem se combinadas para um arvore.
Pgina 26 de 191
Diagrama de Seqncia
lc _d e l riv r
lc _c r l a
C n led F c o tro e o o R to o e rn
Data: 26/09/06
Seqncia de Diagrama, diferente de diagrama de classes, mostra a dinmica entre os objetos. Eles representam um processo, ou situao. Diagrama de seqncia tem foco principal na seqncia de tempo da mudana da informao: a) Criao e Deleo de Objetos b) Mudana de Mensagens entre os objetos. Diagrama de Seqncia no tem notaes para representaes de mtodos estticos. A linha de vida do objeto representada por linhas pontilhadas na vertical O Controle de Fluxo exibido na vertical como um retngulo na linha de vida do objeto. O controle de fluxo mostra o perodo dos objetos ativos: - Um objeto ativo quando as aes so executadas - Um objeto indiretamente ativo se ele esta esperando por uma procedure subordinada para terminar. Mensagens so exibidas como setas horizontais entre linhas de objetos. A mensagem escrita acima na seta no form Mtodo (parameters) . Existem vrias formas de representar resposta (replay). Para este caso, na seta exibido como um seta de retorno. Voc pode tambm incluir a descrio de processos a adicionar comentrios para as linhas de vida dos objetos requeridos.
Pgina 27 de 191
lc _di e l rv r
l l _c r c a
lc _t n l ak
1:g t _nv l e e
_g s l a ao in 2:g t _nv l e e _g s l a ao in
r e_n e iv l
r _n e e i l v
R _n e e iv l R _n e e iv l = t n ->g t _n e ak e iv l _g s li a a on
= g s lin ao a
/ Mx oGs l a im a o in
* 10 0
Data: 26/09/06
Em delegao, dois objetos esto envolvidos na manipulao de uma request. No exemplo acima, a primeira classe delega a execuo de uma request a outra classe. Exemplo: O motorista ( lcl_driver) chama o mtodo get_nivel_gasolina para a classe car (lcl_car) . A classe car no pode executar esta tarefa sozinha.Entretanto, car chama o mtodo get_nivel_gasolina para a classe (lcl_tank), que esta delega a execuo a um mtodo de classe tank. A delegao habilita o car para ser equipado com um novo tank, sem a chamada para o client ou para a classe car. Bons encapsulamentos oferecem o uso forado de delegao: Se a classe tank acima, por exemplo: tivesse um atributo privado da classe car, no seria possvel acessar a classe tank diretamente, somente atravs de carro.
Pgina 28 de 191
1.2 Incluir alguns atributos e mtodos para cada classe. 1.3 Desenhar as linhas de representao entre as classes e indicar possveis cardinalidades.
RESPOSTA:
lcl _carrier -name -airplane _list -flight +set _atritbutes () +display _attributes () +add _plane () +delete _airplane () +get _n_o_planes ()
lcl_airplane -name -plane _type -n_o_plane +set _attributes () +display _attributes () +get_fuel _consump () +get_n_o_airplanes ()
1..*
lcl _passenger _plane -max _passenger -emergency _exits +get _passenges () +display _attributes ()
Pgina 29 de 191
Data: 26/09/06
Pgina 30 de 191
Classes
lcl_vehicle
Acesso Publico Interfaces, metodos e eventos
Pblico (atributos)
Data: 26/09/06
O slide mostra atributos pblicos (em azul) de uma classe que podem ser acessados por qualquer outro objeto. E ao lado direto (em amarelo) os atributos privados em amarelo, mostrando que estes esto encapsulados e no podem ser acessados diretamente. Porque os atributos privados das classes so ocultos? Isto chamado de encapsulamento e usado para proteger o contedo da classe. O objetivo somente proteger e manter a informao sempre atualizada em um nico local e assim, por exemplo: Imagine que os dados so sempre modificados atravs de atributos privados para a classe car e enquanto isto as outras funes permanecem sem modificaes. Ento qualquer outro objeto pode acessar a informao da classe trabalhar normalmente, sem acesso a este tipo de informao.
Pgina 31 de 191
Definio de Classes
lcl_vehicle
Pblico
CLASS lcl_vehicle IMPLEMENTATION. ENDCLASS.
(atributos)
Privados (atributos)
Mtodos
Data: 26/09/06
A classe um modelo de objeto que tem a mesma estruturas e mesmo comportamento. Uma classe formada por atributos, mtodos, eventos, tipos. Em ABAP Objetcs existem duas etapas de declaraes : DEFINITION E IMPLEMENTATION. Os componentes de uma classe so declarados na parte DEFINITION e somente os mtodos podem ser implementados na parte de implementao. A classe no pode ser declarada em cascata ou dentro de outra classe.
Pgina 32 de 191
Atributos
lcl_vehicle Atributos podem ter alguns tipos de dados: C,N,I,P, ...., STRING Tipos de Dicionrios Tipos de user-define TYPE REF TO define uma referncia para um objeto.
Pblico
Privados
make TYPE STRING
Mtodos
Data: 26/09/06
Pgina 33 de 191
CLASS carro DEFINITION. ..... TYPES: .... CONSTANTS: c_x TYPE C VALUE X DATA: var var2 var3 o_car int_car TYPE TYPE TYPE TYPE REF TO TYPE REF TO TYPE ... C, MARA-MATNR, like var3, lcl_car, if_car.]
Data: 26/09/06
Nas declaraes de classe somente pode ser usado TYPE para a declarao de tipos de dados. No pode ser utilizado o LIKE para objetos locais. A adio READ-ONLY significa que um atributo pblico declarado com DATA pode ser lido de fora, mas no pode ser modificado pelos mtodos de uma classe.
Pgina 34 de 191
Atributos Pblicos: Podem ser acessados e alterados por qualquer outro objeto. Acesso direto. Atributos Privados: Somente podem ser acessados e alterados dentro da prpria classe. Sem acesso de fora da classe.
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. DATA: cor(10) TYPE PRIVATE SECTION. ENDCLASS.
C.
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. PRIVATE SECTION. DATA: cor(10) TYPE ENDCLASS.
C.
Data: 26/09/06
Os atributos que no devem ser acessados fora da classe podem ser declarados como private. Na parte PRIVATE SECTION. Os atributos que devem ser acessados de fora da classe podem ser declarados como atributos pblicos. Na parte PUBLIC SECTION. O atributo cor definido como public para a classe lcl_vehicle. Os atributos pblicos que pertenam a classes de interfaces, que as implementaes podero publicadas, devem estar declarados como PUBLICOS para que seja possvel a implementao. De modo geral a declarao de atributos pblicos deve ser o menor possvel.
Pgina 35 de 191
lcl_vehicle
Instancia da Classe
o_vehicle Acessos pelos mtodos
set_make get_make
Pblico
Privados
make TYPE STRING
Mtodos
get_make set_make
Data: 26/09/06
Voc pode acessar atributos privados atravs de mtodos , onde eles podem retornar o valor do atributo, ou modific-lo.
Pgina 36 de 191
Atributos de Instancias: Um por instancia Declarao DATA: Atributos Stticos Somente um por classe Declarao CLASSDATA: Conhecido tambm como atributo de classe.
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. .... PRIVATE SECTION. DATA: cor(10) TYPE
C.
Data: 26/09/06
Os atributos podem ser de Instancia ou Estticos. Atributos de instancia existem separadamente para cada objeto. Atributos de Instancias so definidos como declarao DATA. Atributos Estticos existem somente um por classe e so visveis para todas as instancias da classe. Atributos Estticos usualmente contm informaes que se aplica para todas as classes, exemplos: - Dados que so os mesmos em todas as instancias - Informaes administrativas da classe, como contadores,...
Pgina 37 de 191
Atributos Estticos
numero_veiculos (3)
Data: 26/09/06
Pgina 38 de 191
Mtodos
CLASS carro DEFINITION. METHODS: <nome_metodo> [ IMPORTING <im_var> TYPE C EXPORTING <ex_var> TYPE C CHANGING <ch_var> TYPE C RETURNING VALUE (re_var) TYPE C EXCEPSTIONS <excepstion> RAISING <class_exception> ].
Data: 26/09/06
Mtodos so funes internas determinadas na classe. Eles podem acessar todos os atributos e modific-los. Mtodos podem ter parmetros de interface e so chamados de assinatura que habilitam a recepo de valores, quando passados por outros programas. Mtodos podem ter os seguintes parmetros: IMPORTING, EXPORTING, CHANGING e RETURN e parmetros de excees. Todos os parmetros podem ser passados por valor ou referencia. Acima da verso SAP Basis 6.10 possvel utilizar exceptions. Voc pode definir um cdigo de retorno usando a declarao RETURNING. Este somente pode ser um parmetro simples, o qual pode ser passado como valor. Voc no pode definir parmetros EXPORTING e CHANGING. Todos os parmetros (IMPORTING, CHANGING) podem ser definidos como opcional, nas declaraes usando OPTIONAL ou DEFAULT adies. Estes parmetros no necessariamente tem que ser passados quando o objeto criado. Se voc usa a opo OPTIONAL, os parmetros permanecem inicializados de acordo com o tipo, visto que, o DEFAULT entrar com um valor inicia.
Pgina 39 de 191
Mtodos Pblicos: Podem ser acessados e alterados por qualquer outro objeto. Mtdos Privados: Somente podem ser acessados e alterados dentro da prpria classe.
C.
Data: 26/09/06
O mtodo incia_cor um mtodo privado que somente pode ser executado, por exemplo, pelo constritor. J o mtodo set_cor pode ser acessado por qualquer outro objeto.
Pgina 40 de 191
Data: 26/09/06
No mtodo get_count, voc pode somente usar o atributos esttico numero_veiculos. Todos os outros atributos da classe so atributos de instancias e somente pode ser usados com mtodos de instancia.
Pgina 41 de 191
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS: set_cor importing im_cor(10) type C CLASS-METHODS: get_count exporting im_make TYPE I. PRIVATE SECTION. DATA: cor(10) TYPE C. CLASS-DATA: numero_veiculos TYPE I . ENDCLASS.
Data: 26/09/06
Pgina 42 de 191
Criao de Objetos
Objetos so criados usando a declara o CREATE OBJECT Objetos somente podem ser criados e acessados atrav de s variveis de referncias, exemplo: TYPE REF TO.
lcl_vehicle -make -model +numero _veiculos +set _make () -inicia _cor () +get_count ()
Data: 26/09/06
As classes so as descries de um objeto. Elas descrevem todas as caractersticas que sero comuns em todos os objetos da mesma classe. Em tempo de execuo os objetos so criados em memria e essa criao se chama instanciao.
Pgina 43 de 191
C.
Data: 26/09/06
DATA: o_carro TYPE REF TO lcl_vehicle declarada como um varivel de referencia que atua como um ponteiro para um objeto.
Pgina 44 de 191
Criao de Objetos
o_carro2 TYPE REF TO lcl_vehicle, START-OF-SELECTION. CREATE OBJECT o_carro. CREATE OBJECT o_carro1.
Data: 26/09/06
O comando CREATE OBJECT cria um objeto em memria. Os valores dos atributos para este objeto so inicialmente criados com os valores iniciais ou entradas iniciais com a declarao VALUE. No slide acima os dois objetos o_carro e o_carro1, so duas referencias ou ponteiros da classe lcl_vehicle. Variveis de referencias podem ser atribudas uma a outra, exemplo (o_carro = o_carro1).
Pgina 45 de 191
Garbage Collector
o_carro2 TYPE REF TO lcl_vehicle, START-OF-SELECTION. CREATE OBJECT o_carro. CREATE OBJECT o_carro1. o_carro = o_carro1.
Data: 26/09/06
O GARBAGE COLLECTOR uma rotina de sistema que deleta objetos que esto muito sem atividades na memria e libera espao em memria. O Garbage Collector um recurso comum em todas as linguagens orientadas a objeto. Pois com certeza uma funo muito importante para monitorar memria e eliminar objetos que esto com status de inativos.
Pgina 46 de 191
Garbage Collector
Todos os objetos ativos so marcados com um check. Os objetos que no esto marcados so deletados da memria pelo Garbage Collector
o_carro1
o_carro
Data: 26/09/06
Pgina 47 de 191
Referencias de Buffer
REPORT. DATA: o_carro TYPE REF TO lcl_vehicle, ti_carros TYPE TABLE OF REF TO lcl_vehicle. o_carro2 TYPE REF TO lcl_vehicle, START-OF-SELECTION. CREATE OBJECT o_carro. APPEND o_carro TO ti_carros. CREATE OBJECT o_carro1. APPEND o_carro1 TO ti_carros.
lcl_vehicle -make -model +numero_veiculos +set_make() -inicia_cor() +get_count()
lcl_vehicle
Data: 26/09/06
possvel guardar diversos objetos em um programa atravs de uma tabela interna. Onde os campos da tabela interna sero os mesmos da classe que foi referencia no comando TYPE TABLE OF REF TO. possvel ler a tabela atravs de LOOP.
Pgina 48 de 191
Agregao
lcl_vehicle
lcl_wheel (03)
Pblico
Privados
ti_wheels
lcl_wheel (08)
Mtodos
Data: 26/09/06
Se uma classe define referencias de objetos para uma segunda classe como atributos ( no exemplo acima referencias da classe lcl_wheels), somente estas referencias de objetos sero armazenadas em objetos pertencentes a aquela classe. Os objetos da segunda classe lcl_wheels tm identidade prpria. Eles esto encapsulados na primeira classe lcl_vehicle a podem somente serem acessados para esta classe, usando variveis de referncias.
Pgina 49 de 191
Chamando Mtodos
lcl_vehicle
Privados
Data: 26/09/06
Existem trs tipos de mtodos: -1. So acionados e no retornam valores. -2. Mtodos que retornam valores. -3. Mtodos que retornam ou modificam diversos valores. O slide exibe a duas chamadas de mtodos: uma anterior a verso do release SAP 4.7 que mostra que deve ser utilizado CALL METHOD e outra, exibindo que o release igual ou maior que 4.7 o comando CALL METHOD pode ser omitido.
Pgina 50 de 191
CALL METHOD <instancia>-><mtodo de instancia> EXPORTING <ex_var> = var IMPORTING <im_var> = var CHANGING <ch_var> = var RECEVING <re_var> = var EXCEPTIONS <exceptions> = <nr>
make_name TYPE STRING. make_name = make a car. CALL METHOD o_carro->set_make EXPORTING ex_make = make_name. o_carro->set_make ( make_name ). o_carro->get_make ( IMPORTING im_make = make_name ).
Data: 26/09/06
Mtodos de instancia so chamados com o comando CALL METHOD utilizando a sintaxe <objeto>-><mtodo de instancia>. Os parmetros para a assinatura do mtodo (IMPORTING, EXPORTING...) so separados por espaos.
Pgina 51 de 191
CALL METHOD <nome classe>=><mtodo de instancia> EXPORTING <ex_var> = var IMPORTING <im_var> = var CHANGING <ch_var> = var RECEVING <re_var> = var EXCEPTIONS <exceptions> = <nr>
Data: 26/09/06
Mtodos estticos so chamados pela classe e mtodo <nome classe>=><mtodo da classe esttico> Mtodos estticos no precisam de instancias.
Pgina 52 de 191
Mtodos de Funcionalidades
Definindo: Somente um parmetro RETURNING. Chamando: RECEIVING parmetros so possveis. Vrias formas so possveis:
MOVE, CASE, LOOP Lgicas (IF,CHECK)
Data: 26/09/06
Mtodos que tem um parmetro de retorno so classificados como mtodos funcionais. Estes mtodos no podem ter parmetros EXPORTING e CHANGING.
Pgina 53 de 191
Mtodos Funcionais
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS: get_avarege_fuel IMPORTING im_distance im_fuel RETURNIG VALUE(re_fuel) ENDCLASS.
DATA: o_carro TYPE REF TO lcl_vehicle, o_carro2 TYPE REF TO lcl_vehicle, avg_fuel TYPE ty_fuel.
Data: 26/09/06
Sintaxe de parmetros: - Sem parmetros IMPORTING: o_ref->metodo( ). - Um parmetro IMPORTING o_ref->mtodo ( p1 ) ou o_ref->mtodo ( im_fuel = p1 ) - Mais de uma parmetro IMPORTING o_ref->mtodo ( im_fuel = p1 im_modell = p2 im_color = p3 ) Exemplo de sintaxe de um mtodo funcional. CALL METHOD o_carro->get_average_fuel IMPORTING im_distance = 500 Im_fuel = 50 RECEIVING re_fuel = avg_fuel.
Pgina 54 de 191
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. DATA: make TYPE string READ-ONLY. CLASS-DATA: n_o_vehicles TYPE I READ-ONLY. ... ENDCLASS. DATA: o_carro TYPE REF TO lcl_vehicle, make_name TYPE string, count TYPE I. START-OF-SELECTION. CREATE OBJECT o_carr. make_name = o_carro->make. count = lcl_vehicle=>n_o_vehicles.
Data: 26/09/06
Existem duas formas de acessar atributos pblicos: - Atravs <nome classe>=>< atributo da classe>. - <instancia>-><atributo de instancia>. - => Acessa atributos estticos. - -> Acessa atributo de instancia. OBS.: A diferena entre como acessar um mtodo e um atributo parnteses ( ). Os atributos no precisam de parnteses e mtodos necessrio inform-los.
Pgina 55 de 191
Mtodo Constructor
mtodo que pode ser definido para definir um estado inicial de um objeto. Somente parmetros IMPORTING e EXCEPTIONS. Somente executado na criao do OBJETO. METHODS constructor IMPORTING im_para1 EXCEPTIONS ex_par .
Data: 26/09/06
lcl_vehicle -make -modell -price -color +constructor () +set_make () +display _attributes () +increase _speed ()
O constructor um mtodo que executado sempre na criao de objeto (instancia) e tem os seguintes papis: - Cada classe somente pode ter definido um mtodo constructor - Sempre criado em tempo de execuo CREATE OBJETC. - Se o constructor declarado ele dever ser declaro como PUBLICO.
Pgina 56 de 191
Constructor
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS constructor IMPORTING im_make TYPE string, im_model TYPE string. PRIVATE SECTIONS. DATA: make TYPE string, weight TYPE p. CLASS-DATA: n_o_vehicles TYPE I. ENDCLASS. CLASS lcl_vehicle IMPLENTATION. METHODS constructor make = im_make. model = im_model. ADD 1 TO n_o_vehicles. ENDMETHOD. ENDCLASS. DATA o_carro TYPE REF TO lcl_vehicle. ... CREATE OBJECT o_carro EXPORTING im _make im_model
= BMW = X5.
Data: 26/09/06
Pgina 57 de 191
Constructor Esttico
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. CLASS-METHODS: CLASS_CONSTRUCTOR. PRIVATE SECTIONS. CLASS-DATA: n_o_vehicles TYPE I. ENDCLASS.
DATA o_carro TYPE REF TO lcl_vehicle. ... CREATE OBJECT o_carro. Cont = lcl_vehicle=>n_o_vehicles.
Data: 26/09/06
O construtor esttico um mtodo especial de uma classe com o nome class_constructor. Ele executado uma nica vez quando a classe acessada pela primeira vez.
Pgina 58 de 191
Recurso ME
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS constructor IMPORTING im_make TYPE string, im_model TYPE string. PRIVATE SECTIONS. DATA: make TYPE string. ENDCLASS. CLASS lcl_vehicle IMPLENTATION. METHODS constructor DATA make TYPE string FORD. CONCATENATE im_make make INTO ME->make. ENDMETHOD. ENDCLASS.
lcl_vehicle
Pblico
Privados
Mtodos
ME->make
Data: 26/09/06
Assim como outras linguagens O.O como JAVA, .NET existe um recurso semelhante no ABAP OO, o comando ME. Como este comando possvel acessar objetos(atributos e mtodos) da classe, desde que esta classe seja uma instancia. Exemplo ME->make que acessa o atributo make da prpria classe.
Pgina 59 de 191
EXERCCIOS: 1. 1.1 1.1.1 1.1.2 1.1.3 Criao da Classe Criar um pacote ZBXOO_XX por aluno ou micro. Criar um programa principal chamado ZBXOO_MAIN_AIRPLANE_XX e um include chamado ZBXOO_AIRPLANE_XX. Cria uma classe local chamada lcl_ariplane no include ZBXOO_AIRPLANE_XX. Criar dois atributos de instancia privados - name tipo string - planetype tipo saplane-planetype. Criar um atributo pblico esttico n_o_airplanes do tipo i. Criar um mtodo pblico de instancia set_attributes para atribuir valores aos atributos privados name planetype e adicione 1 no atributo esttico n_o_airplanes. Criar um mtodo pblico de instancia display_attributes para exibir o atributo n_o_airplanes com o
comando WRITE, voc pode exibir atravs dos cones icon_ws_plane, onde esto no TYPE-POOLS.
2. 2.1 2.2
Instanciando Objetos No programa ZBXOO_MAIN_AIRPLANE_XX declarar uma referencia (TYPE REF TO) para a classe lcl_airplane com nome exemplo r_plane. Definir uma tabela interna TYPE TABLE OF REF TO para armazenar as instancias criadas com seus valores da classe lcl_airplane. Criar o objeto CREATE OBJECT para r_plane. Executar o mtodo set_attributes trs vezes passando os parmetros name e planetype. Exemplos: name = AA Dallas planetype = 747-400 Criar um loop na tabela interna criada e atribuir ao objeto r_plane criado e executar dentro do loop a chamada ao mtodo display_attributes, para exibir os atributos dos objetos criados. Debugar o programa verificando como so armazenadas as instancias. Executar o mtodo display_n_o_airplanes para exibir o total de instancias.
Pgina 60 de 191
3.1.2
*&---------------------------------------------------------------------* *& Include ZBXOO_AIRPLANE_00 *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_airplane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_airplane DEFINITION. PUBLIC SECTION. CONSTANTS: pos_1 TYPE i VALUE 30. METHODS: set_attributes IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype, display_atributes. CLASS-METHODS: display_n_o_airplanes. PRIVATE SECTION. DATA: name type string, planetype type saplane-planetype. CLASS-DATA: n_o_airplanes type i. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_airplane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_airplane IMPLEMENTATION.
Pgina 61 de 191
Pgina 62 de 191
*&---------------------------------------------------------------------* *& Report ZBXOO_MAIN_AIRPLANE_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_MAIN_AIRPLANE_00 TYPE-POOLS icon. INCLUDE ZBXOO_AIRPLANE_00. DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane. DATA: count TYPE i. START-OF-SELECTION. CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_plane. r_plane->set_attributes( im_name = 'LH Berlin' im_planetype = '747-400' ). APPEND r_plane TO plane_list. CREATE OBJECT r_plane. r_plane->set_attributes( im_name = 'AA Dallas' im_planetype = '747-400' ). .
APPEND r_plane TO plane_list. CREATE OBJECT r_plane. r_plane->set_attributes( im_name = 'UA Chigago' im_planetype = '747-400' ). APPEND r_plane TO plane_list.
Pgina 63 de 191
Pgina 64 de 191
*&---------------------------------------------------------------------* *& Include ZBXOO_AIRPLANE_00_B *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_airplane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_airplane DEFINITION. PUBLIC SECTION. CONSTANTS: pos_1 TYPE i VALUE 30. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype, display_atributes. CLASS-METHODS: display_n_o_airplanes. PRIVATE SECTION. DATA: name type string, planetype type saplane-planetype. CLASS-DATA: n_o_airplanes type i. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_airplane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_airplane IMPLEMENTATION. METHOD constructor. name = im_name. planetype = im_planetype. n_o_airplanes = n_o_airplanes + 1. ENDMETHOD. METHOD display_atributes. WRITE: / icon_ws_plane as icon, / 'Name of airplane: '(001), AT pos_1 name, / 'Airplane type '(002), AT pos_1 planetype. ENDMETHOD. METHOD display_n_o_airplanes. WRITE: /,/ 'Total nember of planes'(ca1), *
Pgina 65 de 191
*&---------------------------------------------------------------------* *& Report ZBXOO_MAIN_AIRPLANE_00_B *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_MAIN_AIRPLANE_00_B TYPE-POOLS icon. INCLUDE ZBXOO_AIRPLANE_00_B. DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane. DATA: count TYPE i. START-OF-SELECTION. CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_plane EXPORTING im_name = 'LH Berlin' im_planetype = '747-400'. APPEND r_plane TO plane_list. CREATE OBJECT r_plane EXPORTING im_name = 'AA New York' im_planetype = '747-300'. APPEND r_plane TO plane_list. CREATE OBJECT r_plane EXPORTING im_name = 'UA Chigago' im_planetype = '747-400'. APPEND r_plane TO plane_list. LOOP AT plane_list INTO r_plane. CALL METHOD r_plane->display_atributes. .
Pgina 66 de 191
Pgina 67 de 191
5. HERANA (INHARITANCE)
Herana
()
Data: 26/09/06
Herana o relacionamento entre Super Classes e SubClasses, onde as subclasse herdam as caractersticas da superclasses. Nas subclasses tambm possvel adicionar novos componentes como atributos e mtodos. No slide acima a classe vehilce tem atributos como make, model..., e os mtodos display_atributes e get_count e estes componentes so herdados pelas subclasses (lcl_car, lcl_truck e lcl_bus) automaticamente.
Pgina 68 de 191
Herana Mltipla
Super Classe A
Super Classe B
SubClasse 1
SubClasse 2
Data: 26/09/06
Herana deve ser utilizada para implementao de GENERALIZAO e ESPECIALIZAO. A superclasse a generalizao das suas subclasses. As subclasses a especializao da superclasses. Em ABAP Objects no possvel Herana Mltipla(herdar caractersticas de duas classe ao mesmo tempo) , somente herana simples.
Pgina 69 de 191
Superclasses
Contm componentes de forma genrica para possvel reutilizao de cdigos.
Subclasse
Contm os componentes herdados da Superclasse e possibilita implementao de novos componentes.
Data: 26/09/06
A Herana excelente forma de centralizar alguns componentes comuns e podero ser utilizados por demais subclasses. E ainda permite implementaes nas subclasses, no invalidando o que este definido na superclasse. Segue abaixo alguns pontos fortes na utilizao de herana: - Centralizao de cdigo nas SuperClasses - Reuso de cdigo pelas subclasses - possvel fazer redefinies( alteraes de mtodos) - As alteraes realizadas nas Superclasses so automaticamente herdadas pelas Subclasses.
Pgina 70 de 191
Herana em ABAP
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS estimate_fuel IMPORTING im_distance TYPE string, RETURNING VALUE (re_fuel) TYPE ty_fuel. PRIVATE SECTIONS. DATA: make TYPE string. ENDCLASS.
CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. PUBLIC SECTION. METHODS get_cargo RETURNING VALUE (re_cargo) TYPE ty_cargo. PRIVATE SECTIONS. DATA: max_cargo ENDCLASS.
TYPE ty_cargo.
Data: 26/09/06
No exemplo acima a subclasse lcl_truck herda todos os componentes da superclasse lcl_vehicle com a declarao INHERINTING FROM. Ento a subclasse j possui o mtodo estimate_fuel e o atributo make.
Pgina 71 de 191
Redefinio
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS estimate_fuel IMPORTING im_distance TYPE string, RETURNING VALUE (re_fuel) TYPE ty_fuel. ENDCLASS. CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. PUBLIC SECTION. METHODS estimate_fuel REDEFINITION. ... ENDCLASS. CLASS lcl_truck IMPLEMENTATION. METHODS estimate_fuel REDEFINITION. ... super->estimate_fuel( ..,). ENDMETHOD.. ENDCLASS.
Data: 26/09/06
A REDEFINIO uma redefinio do cdigo do mtodo na subclasse herdado da superclasse. No caso do slide acima o mtodo estimate_fuel est sendo redefinido e sendo executado novamente. Note que o mtodo estimate_fuel est sendo executado com a declarao super->, onde esta declarao executa o mtodo da superclasse. No possvel redefinir mtodos privados. ABAP Objetc no suporta overloading, somente no mtodo constructor. Isto valido para o caso de redefinio sem interface.
Pgina 72 de 191
Redefinio do Construtor
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS contructor IMPORTING im_make TYPE string, ENDCLASS.
CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. PUBLIC SECTION. METHODS constructor IMPORTING im_make TYPE string im_cargo TYPE ty_cargo. PRIVATE SECTION. DATA: max_cargo TYPE ty_cargo. ... ENDCLASS. CLASS lcl_truck IMPLEMENTATION. METHODS constructor REDEFINITION. ... super->constructor( im_make = make ) . max_cargo = im_cargo. ENDMETHOD.. ENDCLASS.
Data: 26/09/06
O constructor da superclasse sempre deve ser executado, para iniciar os componentes da superclasse corretamente para garantir a integridade dos componentes. No caso o constructor na Subclasse adicionou o atributo max_cargo que pertence a REDEFINIO da Subclasse. Construtores estticos so chamados automaticamente.
Pgina 73 de 191
Protect Componentes
Public compoentes Qualquer objeto pode acessar Private compoentes Somente a classe pode acessar
lcl_vehicle -make -modell -serial_no -color -n_o_vehicles #tank +constructor() +display_attributes() +get_count()
Data: 26/09/06
Assim como declaraes Pblicas ( todos acessam ) , Private ( somente as classes acessam) , existe tambm PROTECTED, onde este permite que componentes sejam visualizados de superclasses para subclasses.
Pgina 74 de 191
Mtodos herdados podem ser redefinidos com as seguintes regras nas subclasses. Sempre devem ser implementados na subclasse Os parmetros no podem ser modificados Mtodos estticos no podem ser redefinidos Em herana, atributos estticos so compartilhados, elas compartilham PUBLIC e PROTECT atributos com subclasses.
lc _T a s o te l rnpr +a to o ia u nm _g s () a
lc _c r o l ar +a to o ia u nm _g s () a
lc _a i l v o +a to o ia u nm _g s () a
lc _tr m l e +a to o ia u nm _g s () a
Data: 26/09/06
Ao utilizar o conceito de redefinio, o ideal utilizar a notao correta de redefinio. No somente adicionar novos componentes para as subclasses, e sim, utilizar a redefinio. Redefinindo somente (mtodos de instancia Pblicos e Protect) , os demais componentes como ( mtodos e atributos estticos) no pode ser redefinidos. No confundir REDEFINITION com OVERLOADING: Onde overloading um forma de ter classes com mtodos com mesmo nome, mas com assinaturas diferentes, isto no possvel em ABAP Objects.
Pgina 75 de 191
Exemplos de Redefinio
lc _T a s o te l rnpr +a to o ia u nm _g s () a
lc _c rr l a o +a to o ia u nm _g s () a
lc _a i l v o +a to o ia u nm _g s () a
lc _tre l m +a to o ia u nm _g s () a
CLASS lcl_carro IMPLEMENTATION. METHODS autonomia_gas REDEFINITION. total = tank * 50. ENDMETHOD. ENDCLASS.
CLASS lcl_trem IMPLEMENTATION. METHODS autonomia_gas REDEFINITION. total = tank * 150. ENDMETHOD. ENDCLASS.
Data: 26/09/06
Note que os dois mtodos foram redefinidos utilizando regras diferentes para calcular o mtodo autonomia_gas para as classes lcl_carro e lcl_trem.
Pgina 76 de 191
EXERCCIOS: 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 1.10 1.11 1.12 1.13 1.14 1.15 Hierarquia de Classes Criar uma subclasse lcl_passenger_plane para classe lcl_airplane, no mesmo include ZBXOO_AIRPLANE_XX. Implementar tambm um mtodo Construtor(name e planetype) Pblico para receber os valores iniciais para os atributos de todas as instancias criadas. Criar um atributo privado de instancia max_seats do tipo sflight-seatsmax e incluir como parmetro do mtodo constructor. No mtodo constructor execute o mtodo constructor da superclasse (importando os atributos name e planetype) e depois a atribua algum valor a atributo seats. Redefina o mtodo display_attributes da classe lcl_airplane, usando a declarao REDEFINITION e com o comando WRITE exibir o comando max_seats. Criar uma subclasse lcl_cargo_plane da classe lcl_airplane, no mesmo include. Criar um atributo privado de instancia max_cargo com o mesmo tipo saclane-cargomax e incluir como parmetro do mtodo constructor. Criar um construtor pblico para receber todas as instancias. No mtodo constructor execute o mtodo constructor da superclasse (importando os atributos name e planetype) e depois a atribua algum valor a atributo max_cargo. Redefina o mtodo display_attributes da classe lcl_airplane, usando a declarao REDEFINITION e com o comando WRITE exibir o max_cargo. No programa principal, utilizando a declarao CREATE OBJETC criar novas referencias das classes lcl_passenger_palne e lcl_cargo_plane. Crie um mtodo esttico display_n_o_airplanes depois de instanciar os objetos. Preencher os atributos na criao das novas classes, atravs do constructor. Chamar o mtodo display_attributes para todas as instancias. Chamar o mtodo display_n_o_attributes do objeto lcl_airplane ao final do programa.
Pgina 77 de 191
*&---------------------------------------------------------------------* *& Report ZBXOO_INHS_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_INHS_MAIN_00 TYPE-POOLS icon. INCLUDE ZBXOO_INHS_00 . DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane, r_cargo type ref to lcl_cargo_plane, r_passenger type ref to lcl_passenger_plane. DATA: count TYPE i. START-OF-SELECTION. CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin' im_planetype = '747-400' im_seats = 345. CREATE OBJECT r_cargo EXPORTING im_name = 'AA New York' im_planetype = '747-300' im_maxcargo = 533. r_cargo->display_atributes( ). r_passenger->display_atributes( ). .
Pgina 78 de 191
Pgina 79 de 191
ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_cargo_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype im_maxcargo TYPE scplane-cargomax, display_atributes REDEFINITION. PRIVATE SECTION. DATA: max_cargo TYPE scplane-cargomax. ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_cargo_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane IMPLEMENTATION. METHOD: constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_cargo = im_maxcargo. ENDMETHOD. METHOD: display_atributes. CALL METHOD super->display_atributes( ). WRITE: / 'Max Cargo = ', max_cargo. ENDMETHOD. ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_passenger_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION.
Pgina 80 de 191
ENDCLASS.
Pgina 81 de 191
6. CASTING
O que CAST?
Data: 26/09/06
Cast um conceito que existe nas linguagens orientadas a objeto de generalizao, ou seja, atribuir referencias de subclasse a superclasses. No exemplo acima verificamos a classe truck ( subclasse ) a classe veiculo ( superclasse ).
Pgina 82 de 191
Conceitos de Casting
Casting:
Instancias de subclasses podem ser usadas em qualquer contexto, depois das referencias de subclasses serem atribu das as superclasses. Os componentes herdados de superclasses podem ser acessados. Permite acesso genrico de hierarquia de classes.
Data: 26/09/06
Um dos princpios da herana a instancia de subclasses que podem ser usadas de qualquer forma, ento tambm possvel atribuir subclasses a superclasses, dessa forma, possvel acessar todas as subclasses de uma mesma forma e com uma viso genrica. O motivo de se utilizar este conceito devido a necessidade de visualizao das informaes de forma genrica, ou seja, se o programa que for desenvolvido no tem necessidade visualizar as classes de forma mais especfica, ento utilizado o CAST.
Pgina 83 de 191
O que CAST?
TYPE REF TO lcl_vehicle, TYPE REF TO lcl_truck, TYPE REF TO lcl_carro, TYPE REF TO lcl_onibus,
CREATE OBJECT o_carro. APPENDE o_carro TO ti_vehicle. CREATE OBJECT o_truck. APPENDE o_truck TO ti_vehicle. CREATE OBJECT o_onibus. APPENDE o_onibus TO ti_vehicle.
Data: 26/09/06
O exemplo acima todas as referencias criadas de subclasses so atribudas a tabela interna ti_vehicle do tipo lcl_vehicle que uma superclasse. Dessa forma, possvel ter acesso genrico as informaes das subclasses.
Pgina 84 de 191
CLASS lcl_rental DEFINITION. METHOD add_vehicle. ADD im_vehicle TO vehicle_list ENDMETHOD. METHOD calc_estimated_fuel. DATA: o_vehicle TYPE REF TO lcl_vehicle. LOOP AT vehilce_list INTO o_vehicle. re_fuel = re_fuel + o_vehicle->estimated_fuel ( im_distance ). ENDLOOP. ENDMETHOD. ENDCLASS.
Data: 26/09/06
Polimorfismo o comportamento de mtodos de objetos de diferentes classes com o mesmo nome, ou seja, de acordo com o tipo de classe o mtodo ter um comportamento de acordo com a sua implementao. Isto possvel de ser feito atravs de herana, redefinindo um mtodo de superclasse na subclasse e implementando de formas diferentes de acordo com especialidade da classe. Polimorfismo um dos pontos fortes de herana, onde voc pode trabalhar da mesma forma com diferentes classes, com a garantia da implementao dos tipos de classes diferentes e o runtime que ser encarregado de executar a implementao correta de acordo com a classe.
Pgina 85 de 191
Polimorfismo
CLASS lcl_rental DEFINITION. ... METHOD calc_estimated_fuel. DATA: o_vehicle TYPE REF TO lcl_vehicle. LOOP AT vehilce_list INTO o_vehicle. re_fuel = re_fuel + o_vehicle->estimated_fuel ( im_distance ). ENDLOOP. ENDMETHOD. ENDCLASS. METHOD calc_estimated_fuel. total_weight = max_passenger * average_weight + weight. re_fuel = total_weight * im_distantce * factor. ENDMETHOD. METHOD calc_estimated_fuel. total_weight = max_cargo + weight. re_fuel = total_weight * im_distantce * factor. ENDMETHOD.
Objeto para a classe nibus com a implementao com o clculo especifico para lcl_bus
Objeto para a classe caminho com a implementao com o clculo especifico para lcl_trucx
Data: 26/09/06
No LOOP acima na tabela interna vehicle_list que contm de forma genrica todas as referencias das subclasses(lcl_bus, lcl_truck e lcl_car), ento de acordo com cada implementao da subclasse no mtodo estimate_fuel, o prprio runtime executar o mtodo da respectiva classe, como mostra o exemplo acima. Para os tipos de classes lcl_bus existe um tipo de clculo total_weight e para truck ele ser outro clculo. Mas quando executado o mtodo dentro do loop, ele ser calculado de acordo com a reference criada.
Pgina 86 de 191
Nas linguagens de programao orientadas a objetos, no necessrio modificar o cdigo, se voc adiciona subclasses com polimorfismo. Em linguagens procedurais, voc utilizaria um CASE para implementar o mesmo cdigo.
LOOP AT vehilce_list INTO o_vehicle. CASE vehicle-tipo. WHEN TRUCK perform estimate_fuel_truck USING ...... WHEN BUS perform estimate_fuel_bus USING ...... ENDLOOP.
Data: 26/09/06
Polimorfismo torna a programao mais fcil, e para caso de ser necessrio implementar novos clculos por exemplo, uma classe trem. No caso de utilizao de polimorfismo, somente ser necessrio incluir na classe e atribu-la a classe vehicle. No caso de um programa normal, seria necessrio, no exemplo acima, criar um novo perform estimate_fuel_trem e alterar o case incluindo a clausula TREM.
Pgina 87 de 191
Data: 26/09/06
O Widening utilizado quando existe a necessidade de especializao, ter acesso a informao em nvel mais especifico. Conforme o exemplo acima foi necessrio obter uma informao na subclasse truck, onde no existia no nvel da classe vehicle(superclasse) O operador utilizado para widening ?=, equivalente ao MOVE, TO. Outro comando muito importante utilizado TRY CATCH ( com a classe de exceo CX_SY_MOVE_CAST_ERRO ) que um comando muito comum linguagens OO, assim como JAVA, .NET , DELPHI e outras. (Este ser detalhado no capitulo de Exceptions).
Pgina 88 de 191
2.2 Crie o objeto r_carrier e informar um nome de uma linha area no constructor. 2.3 Adicionar aeronaves j criadas noS objetos r_passenger e r_ cargo no mtodo add_airplane da classe lcl_carrier.
*&---------------------------------------------------------------------* *& Report ZBXOO_CASS_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_CASS_MAIN_00 TYPE-POOLS icon. INCLUDE ZBXOO_INHS_00 . DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane, r_cargo type ref to lcl_cargo_plane, r_passenger type ref to lcl_passenger_plane. DATA: count TYPE i. .
Pgina 89 de 191
2.
Polimorfismo 2
*&---------------------------------------------------------------------* *& Report ZBXOO_CASS_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_CASS_MAINB_00 TYPE-POOLS icon. INCLUDE ZBXOO_INHS_00 . DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane, r_cargo type ref to lcl_cargo_plane, r_passenger type ref to lcl_passenger_plane, r_carrier type ref to lcl_carrier. DATA: count TYPE i. START-OF-SELECTION. CALL METHOD lcl_airplane=>display_n_o_airplanes( ). .
CREATE OBJECT r_carrier EXPORTING im_name = 'Smile$Fly-Travel'. CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin'
Pgina 90 de 191
*&---------------------------------------------------------------------* *& Include ZBXOO_AIRPLANE_00_B *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_airplane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_airplane DEFINITION. PUBLIC SECTION. CONSTANTS: pos_1 TYPE i VALUE 30. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype, display_atributes. CLASS-METHODS: display_n_o_airplanes. PRIVATE SECTION. DATA: name type string, planetype type saplane-planetype. CLASS-DATA: n_o_airplanes type i. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_airplane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_airplane IMPLEMENTATION.
Pgina 91 de 191
METHOD constructor. name = im_name. planetype = im_planetype. n_o_airplanes = n_o_airplanes + 1. ENDMETHOD. METHOD display_atributes. WRITE: / icon_ws_plane as icon, / 'Name of airplane: '(001), AT pos_1 name, / 'Airplane type '(002), AT pos_1 planetype. ENDMETHOD. METHOD display_n_o_airplanes. WRITE: /,/ 'Total nember of planes'(ca1), AT pos_1 n_o_airplanes LEFT-JUSTIFIED,/. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_cargo_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype im_maxcargo TYPE scplane-cargomax, display_atributes REDEFINITION. PRIVATE SECTION. DATA: max_cargo TYPE scplane-cargomax. ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_cargo_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane IMPLEMENTATION. METHOD: constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_cargo = im_maxcargo.
Pgina 92 de 191
*----------------------------------------------------------------------* * CLASS lcl_passenger_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype im_seats TYPE sflight-seatsmax, display_atributes REDEFINITION. PRIVATE SECTION. DATA: max_seats TYPE sflight-seatsmax. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_passenger_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane IMPLEMENTATION. METHOD constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_seats = im_seats. ENDMETHOD. METHOD display_atributes. CALL METHOD super->display_atributes( ). WRITE: / 'Max Seats = ', max_seats. ENDMETHOD.
Pgina 93 de 191
*----------------------------------------------------------------------* * CLASS lcl_carrier DEFINITION. *----------------------------------------------------------------------* CLASS lcl_carrier DEFINITION . PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string, get_name RETURNING value(ex_name) TYPE string, add_airplane IMPORTING im_plane TYPE REF TO lcl_airplane, display_airplanes, display_atributes. PRIVATE SECTION. DATA: name TYPE string, airplane_list TYPE TABLE OF REF TO lcl_airplane. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_passenger_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_carrier IMPLEMENTATION. METHOD constructor. name = im_name. ENDMETHOD. METHOD get_name. ex_name = name. ENDMETHOD. METHOD add_airplane. APPEND im_plane TO airplane_list. ENDMETHOD. METHOD display_atributes. display_airplanes( ). ENDMETHOD. METHOD display_airplanes. DATA: r_plane TYPE REF TO lcl_airplane. LOOP AT airplane_list INTO r_plane. r_plane->display_atributes( ). ENDLOOP. ENDMETHOD. ENDCLASS.
Pgina 94 de 191
Pgina 95 de 191
7. INTERFACES
Interfaces
Contedo:
O que so interfaces? Polimorfismo
Data: 26/09/06
Interfaces so implementaes e adies em classes. Derivadas de linguagens OO, como JAVA, .NET interfaces em ABAP Objects tem a mesma funo, manter um padro de implementao de classes. As interfaces mantm um padro de desenvolvimento com os servios nelas definidos como ( mtodos) , assim qualquer classe que implementar dessa interface dever, implementar todos os mtodos da interface, mesmo que no utilize, obedecendo a nomenclatura e o padro. Isto tambm ajuda na comunicao entre a equipe de desenvolvimento e isto chamado tambm de polimorfismo com interfaces.
Pgina 96 de 191
Todas as classes de implementao devero ter os trs mtodos da interface (iniciar, parar e acelerar)
lcl_carro
lcl_n ibu s
lcl_mo to cicleta
Data: 26/09/06
As interfaces so representadas da mesma forma que classes em UML, exceto pelo nome interfaces. Uma classe pode implementar qualquer nmero de interfaces e uma interface pode ser implementada por qualquer nmero de classes. Por implementao pode ser simulando mltipla herana.
Pgina 97 de 191
Interface (ABAP)
Data: 26/09/06
Em Interfaces componentes como ( atributos, mtodos, constantes, tipos, etc.. ) podem ser declarados como em interfaces e implementados em classes, mas estes no visibilidade. (Pblico , Privado e Protect) As interfaces tm as seguintes regras: - Somente podem ser declarados mtodos pblicos - As operaes so definidas nas interfaces e so implementadas nos mtodos das classes. - Atributos, events, constants, e tipos definidos nas interfaces esto automaticamente disponveis na classe de implementao.
Pgina 98 de 191
Componentes de Interface
interface lif _partners +display _partner () +check _availability ()
CLASS lcl_rental IMPLEMENTATION. METHOD lif_partners~display_partner. display_attributes( ). ENDMETHOD. ENDCLASS. DATA: r_rental TYPE REF TO lcl_rental. CREATE OBJECT r_rental. r_renatl->lif_partners~display_partner( ) .
Data: 26/09/06
possvel acessar componentes de interface usando objetos reference, das classes implementadas de interfaces. Isto permite voc diferenciar feito com operador de interface, somente como as definies de mtodos na parte da implementao da classe.
Pgina 99 de 191
Referencias de Interfaces
interface lif _partners +display _partner () +check _availability ()
DATA: o_rental TYPE REF TO lcl_rental. o_li f TYPE REF TO lif_partners. CREATE OBJECT r_rental. o_lif = o_rental.
Data: 26/09/06
Interfaces so acessadas usando referencias de interfaces. Interfaces de referencias sempre referem para instancias de classes. A atribuio de um objeto de referencia para uma referencia de interface conhecido como narrowing cast, por uma herana, somente uma parte de objetos de interfaces visvel somente se voc tem atribudo a referencia. Com object reference, voc pode acessar todos os componentes na classe carregada na implementao, mas somente os componentes definidos na interface. Estes componentes acessam usando exclusividade referencia de interfaces com nomes curtos.
Usando Interfaces
l l _cro c ar
l l _V u c e l co -c r o ar s + ad _v i u s d e l co ( ) l l _ i u c n s b
l l _m oi l t c o c ea t c
Data: 26/09/06
A classes implementadas atravs da classe lcl_veculo recebem todas as outras referencias dos objetos (lcl_carro, lcl_nibus e lcl_motocicleta) atravs do mtodo add_veiculos e so gravados, em tabela interna do tipo lcl_veculols. A principal vantagem como forma de implementao o polimorfismo. Pois somente esto disponveis acessos genricos e as alteraes sero feitas nas implementaes.
Polimorfismo e Interfaces
METHOD lif_veiculos. DATA: o_veiculos TYPE REF TO lif_veiculos. LOOP AT veiculos_list INTO o_veicluos. o_veiculo->mostrar_atributos( ). ENDLOOP. ENDMETHOD.
lcl_carro
lcl_motocicleta
Data: 26/09/06
possvel utilizar polimorfismo atravs de interfaces utilizando referencias de interfaces chamando mtodos que podem ter diferentes implementaes. Atravs de uma tipo dinmico de atravs do mtodo o_veiculo->mostrar_atributos( ) possvel executar implementaes de forma diferentes para o mesmo nome de mtodo.
Interfaces Compostas
interface lif_partners
lcl _rental
Data: 26/09/06
ABAP Objects contm modelo de composio para interfaces. Composio de interfaces contm outras interfaces como componentes (componentes de interfaces) a sumarizam a extenso dos componentes de interfaces. Uma interface pode ser usada como um componente interface em diversas interfaces compostas. Em UML o relacionamento de interfaces compostas (Especializao e Generalizao) definido com linhas pontilhadas.
Interface (ABAP)
INTERFACE lif_partners METHODS: display_partner ENDINTERFACE. INTERFACE lif_room_booking. INTERFACES lif_partners. METHODS: book_room. ENDINTERFACE.
CLASS lcl_hotel DEFINITION. PUBLIC SECTION. INTERFACES lif_room_booking. ENDCLASS. CLASS lcl_hotel IMPLEMENTATION. METHOD lif_partners~display_partner. ENDMETHOD. METHOD lif_room_booking~book_room. ENDMETHOD. ENDCLASS.
Data: 26/09/06
Incluir no programa principal (ZBXOO_CASS_MAIN_XX) o include ZBXOO_INT_XX (copiar do include ZBXOO_INT_00) com a implementao da interface lif_partners e a classe lcl_travel_agency. 1.1.2 Criar os objetos com os seguintes tipos: 1.1.2.1.1 r_carrier TYPE REF TO lcl_carrier 1.1.2.1.2 r_agency TYPE REF TO lcl_travel_agency 1.1.2.1.3 r_rental TYPE REF TO lcl_rental 1.1.2.1.4 r_truck TYPE REF TO lcl_truck 1.1.2.1.5 r_bus TYPE REF TO lcl_bus 1.1.3 1.1.4 Criar um objeto r_carrier Utilizando a instancia r_carrier chamar o mtodo add_airplane passando como parmetro as instancias r_passenger e r_cargo. 1.1.5 Chamar o mtodo display_atributes da instancia r_carrier. 1.1.6 Criar uma instancia r_rental 1.1.7 Criar uma instancia r_truck (incluir name(fabricante) e cargo(modelo). 1.1.8 Atravs da instancia r_rental chamar o mtodo add_vehicle e passar como parmetro (r_truck) 1.1.9 Criar uma instancia r_-bus. 1.1.10 Atravs da instancia r_rental chamar o mtodo add_vehicle e passar como parmetro (r_bus) 1.1.11 Criar uma instancia r_truck (incluir name(fabricante) e cargo(modelo). 1.1.12 Atravs da instancia r_rental chamar o mtodo add_vehicle e passar como parmetro (r_truck) 1.1.13 Executar o mtodo r_agency->display_agency_partners( ). RESPOSTA EXERCCIOS: 1. Interfaces
*
*&---------------------------------------------------------------------* *& Report ZBXOO_INT_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_INT_MAIN_00 TYPE-POOLS icon. INCLUDE ZBXOO_INT_00. INCLUDE ZBXOO_INHS_00. *INCLUDE ZBXOO_INT_AIR_00. DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane, r_cargo type ref to lcl_cargo_plane, r_passenger type ref to lcl_passenger_plane, r_carrier type ref to lcl_carrier, r_agency TYPE REF TO lcl_travel_agency, .
CREATE OBJECT r_carrier EXPORTING im_name = 'Smile$Fly-Travel'. CREATE OBJECT r_agency EXPORTING im_name = 'CVC - Turismo'. *r_agency->add_partner( r_carrier ). CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin' im_planetype = '747-400' im_seats = 345. CREATE OBJECT r_cargo EXPORTING im_name = 'AA New York' im_planetype = '747-300' im_maxcargo = 533. r_carrier->add_airplane( r_passenger ). r_carrier->add_airplane( r_cargo ). CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_agency EXPORTING im_name = 'CVC'. CREATE OBJECT r_rental EXPORTING im_name = 'RENT A CAR'. CREATE OBJECT r_truck EXPORTING im_name = 'MACK' im_cargo = '458'. r_rental->add_vehicle( r_truck ). CREATE OBJECT r_bus EXPORTING im_name = 'MERCEDES' im_passengers = '80'. r_rental->add_vehicle( r_bus ). CREATE OBJECT r_truck EXPORTING im_name = 'VOLVO' im_cargo = '48'. r_rental->add_vehicle( r_truck ).
*&---------------------------------------------------------------------* *& Include ZBXOO_INT_00 *&---------------------------------------------------------------------* TYPES ty_fuel TYPE P DECIMALS 2. TYPES ty_cargo TYPE P DECIMALS 2. *----------------------------------------------------------------------* * INTERFACES lcl_vehicle *----------------------------------------------------------------------* INTERFACE lif_partners. METHODS display_partner. ENDINTERFACE. *----------------------------------------------------------------------* * CLASS lcl_vehicle DEFINITION. *----------------------------------------------------------------------* CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS: get_average_fuel IMPORTING im_distance TYPE s_distance im_fuel TYPE ty_fuel RETURNING VALUE(re_avgfuel) TYPE ty_fuel. METHODS constructor IMPORTING im_make TYPE string. METHODS display_atributes. METHODS set_make IMPORTING im_make TYPE string. METHODS get_make EXPORTING ex_make TYPE string.
CLASS-METHODS: get_count EXPORTING re_count TYPE i. PRIVATE SECTION. DATA: make type string.
CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string
METHODS get_cargo RETURNING value(re_cargo) TYPE ty_cargo. PRIVATE SECTION. DATA: max_cargo TYPE ty_cargo. ENDCLASS. CLASS lcl_truck IMPLEMENTATION. METHOD constructor. super->constructor( im_name ). max_cargo = im_cargo. ENDMETHOD. METHOD display_atributes. super->display_atributes( ). WRITE: 20 ' Cargo = ', max_cargo. ULINE. ENDMETHOD. METHOD get_cargo. re_cargo = max_cargo. ENDMETHOD. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_bus DEFINITION. *----------------------------------------------------------------------*
CLASS lcl_bus DEFINITION INHERITING FROM lcl_vehicle. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_passengers TYPE i. METHODS display_atributes REDEFINITION.
PRIVATE SECTION. DATA: max_passengers TYPE ty_cargo. ENDCLASS. CLASS lcl_bus IMPLEMENTATION. METHOD constructor. super->constructor( im_name ). max_passengers = im_passengers. ENDMETHOD. METHOD display_atributes.
METHODS display_atributes. INTERFACES: lif_partners. PRIVATE SECTION. DATA: name TYPE string, vehicle_list TYPE TABLE OF REF TO lcl_vehicle. ENDCLASS. CLASS lcl_rental IMPLEMENTATION. METHOD lif_partners~display_partner. display_atributes( ). ENDMETHOD. METHOD constructor. name = im_name. ENDMETHOD. METHOD add_vehicle. APPEND im_vehicle TO vehicle_list. ENDMETHOD. METHOD display_atributes. DATA: r_vehicle TYPE REF TO lcl_vehicle. WRITE: 'Lista de Veculos '. ULINE. ULINE. LOOP AT vehicle_list INTO r_vehicle. r_vehicle->display_atributes( ). ENDLOOP. ULINE. ENDMETHOD. ENDCLASS.
8. EVENTOS
Eventos
Receber/Manipular Eventos
Aluguel de Carro
o_car
Sender
Data: 26/09/06
Eventos podem ser iniciados (triggers) e podem, por exemplo, iniciar uma ao. No exemplo acima, a classe carro, aps a criao da instancia o_car, aciona um evento para as outras classes Aluguel de Carro e Registro de Ativo.
Triggering Events
Definio Classes de Eventos
(EVENTS, CLASS-EVENTS)
Handling Events
Mtodos e Classes de manipulao de eventos Objeto de manipulao de eventos
(CLASS- METHODS ... FOR EVENT... OF....)
Data: 26/09/06
Tipos de EVENTOS - Eventos de Instancias ( utilizando a declarao EVENTS ) - Eventos Estticos ( utilizando declarao CLASS-EVENTS ) Classes ou instancias de classes que recebem uma mensagem quando um evento acionado em runtime: CLASS-METHODS <handler_method> FOR EVENT <event> OF <classname> Estas classes ou instancias dessas classes so registradas para uma, ou mais de um evento em runtime: - SET HANDLER <handler_method> FOR <reference>. Para mtodos de instancias. - SET HANDLER <handler_method>. Para mtodos estticos Uma classe ou instancia pode acionar um evento em runtime usando a declarao RAISE EVENT.
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS constructor IMPORTING ... EVENTS vehicle_created. ENDCLASS. CLASS lcl_vehicle IMPLEMENTATION. METHOD constructor. RAISE EVENT vehicle_created. ENDMETHOD. ENDCLASS.
o_car
vehicle_created
Data: 26/09/06
Ambos os eventos de instancia e estticos podem ser acionados em mtodos de instancia. Somente eventos estticos podem ser acionados em estticos mtodos. Eventos podem somente ter o parmetro EXPORTING, onde deve ser passado como valor. Acionando um Evento usando a declarao RAISE EVENT tem o seguinte efeito: - O fluxo do programa interrompido naquele ponto. - Uma vez que os mtodos de event handler foram executados, o fluxo do programa continua.
Handler
o_rental
o_car2
o_ativo
o_car2
vehicle_created
Data: 26/09/06
Eventos so registrados usando a declarao SET HANDLER. Este registro somente ativo em runtime. possvel tambm registrar um objeto para um evento atravs de outro objeto. A declarao SET HANDLER entra todos os registros de eventos em uma lista de objetos. Todos manipuladores( HANDLER) so entrados na lista. Quando um evento acionado, a lista exibe quais mtodos sero acionados.
o_car
o_rental
vehicle_created
Data: 26/09/06
Mtodos de Manipulao de Eventos so acionados por RAISE EVENT, uma vez que eles podem ser chamados como mtodos. (CALL METHOD) A interface de um mtodo de manipulao de evento consiste somente de parmetros de IMPORTING. Voc pode somente usar parmetros de definies aos eventos correspondentes. Um evento de interface, o qual somente tem parmetros EXPORTING, definido usando a declarao EVENTOS na declarao de evento. Os parmetros so do tipo de definio de evento e o tipo passado mtodo manipulador de evento, que , uma interface de parmetros do mtodo manipulador de evento no pode ser tipado na definio mtodo de manipulao de evento.
Registrando Eventos
SET HANDLER <ref_handle>-><on_event> FOR <ref_sender> | FOR ALL INSTANCES [ACTIVATION <var>]. CLASS lcl_rental DEFINITION. PRIVATE SECTION. METHODS: add_vehicle FOR EVENT vehicle_create OF lcl_vehicle IMPORTING sender. ENDCLASS. CLASS lcl_rental IMPLENTATION. METHOD constructor. SET HANDLER add_vehicle FOR ALL INSTANCES. ENDMETHOD. ENDCLASS.
o_car
set_ handler
o_rental
vehicle_created
Data: 26/09/06
Quando um evento acionado, somente estes mtodos manipuladores de eventos so executados, que tem o ponto de registro usando SET HANDLER. possvel registrar um evento usando ACTIVATION X, e desregistrar ele usando ACTIVATION space. Se voc fazer a especificao ACTIVATION, ento os eventos ficam com o comportamento default. Voc pode registrar diversos mtodos em nico SET HANDLER: SET HANDLER <ref_handler1>-><handler_method1> <ref_handler2>-><handler_method2> ..... <ref_handlerN>-><handler_methodN> <ref_sender> | FOR ALL INSTANCES.
FOR
Manipulao de Eventos so seqenciais Garbage Collector tem a mesma integridade dos objetos registrados. Objetos registrados nunca so deletados A visibilidade de um evento define a autoriza o para evento de manipulao. A visibilidade de um mtodo manipulador de evento define a autorizao usando SET HANDLER.
Data: 26/09/06
Se diversos objetos esto registrados para um evento, ento a seqncia nos quais os mtodos manipuladores de eventos so chamados, e no esto definidos, isto , no existe garantia de seqncia nos mtodos de manipulaes de eventos que so chamados. Se um novo evento de manipulao registrado em um mtodo de manipulao de evento para um nico evento que tinha sido acionado, ento este evento adicionado no fim da seqncia, e ento executado quando eles esto retornando. Se um event handler desregistrado em um mtodo manipulador de evento, ento este manipulador deletado de uma seqncia de mtodo manipulador de evento. Eventos tem o conceito de visibilidade podem ser pblicos, privados e protected, onde: - PUBLIC Todos podem acessar. - PRIVATE Somente acesso dentro da classe. - PROTECTED Somente Classes e SubClasses Mtodos manipuladores de eventos tem visibilidade de atributos. Mtodos manipulao de eventos, entretanto, somente podem ter mesma visibilidade ou mais restries de visibilidade que os eventos a que eles se referem. A visibilidade de mtodo de manipulao estabelece autorizao por SET HANDLER. Esta declarao pode ser usada.
*&---------------------------------------------------------------------* *& Report ZBXOO_INT_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_EVE_MAIN_00 TYPE-POOLS icon. INCLUDE ZBXOO_INT_00. INCLUDE ZBXOO_EVE_00. DATA: r_plane TYPE REF TO lcl_airplane, plane_list TYPE TABLE OF REF TO lcl_airplane, r_cargo type ref to lcl_cargo_plane, r_passenger type ref to lcl_passenger_plane, r_carrier type ref to lcl_carrier, r_agency TYPE REF TO lcl_travel_agency, r_rental TYPE REF TO lcl_rental, r_truck TYPE REF TO lcl_truck, r_bus TYPE REF TO lcl_bus. .
DATA: count TYPE i. START-OF-SELECTION. CREATE OBJECT r_carrier EXPORTING im_name = 'Smile$Fly-Travel'. CREATE OBJECT r_agency EXPORTING im_name = 'CVC - Turismo'. *r_agency->add_partner( r_carrier ). CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin'
*&---------------------------------------------------------------------* *& Include ZBXOO_EVE_00 *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_airplane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_airplane DEFINITION. PUBLIC SECTION.
*----------------------------------------------------------------------* * CLASS lcl_cargo_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane IMPLEMENTATION. METHOD: constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_cargo = im_maxcargo. ENDMETHOD. METHOD: display_atributes. CALL METHOD super->display_atributes( ). WRITE: / 'Max Cargo = ', max_cargo. ENDMETHOD. ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_passenger_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype im_seats TYPE sflight-seatsmax, display_atributes REDEFINITION. PRIVATE SECTION.
ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_carrier DEFINITION. *----------------------------------------------------------------------* CLASS lcl_carrier DEFINITION . PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string, get_name RETURNING value(ex_name) TYPE string, add_airplane FOR EVENT airplane_created of lcl_airplane IMPORTING sender, display_airplanes, display_atributes. PRIVATE SECTION. DATA: name TYPE string, airplane_list TYPE TABLE OF REF TO lcl_airplane. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_carrier IMPLEMENTATION. *----------------------------------------------------------------------*
Classes Locais
Classes locais so somente visveis no programa onde elas foram definidas No possvel acesso global No est gravada no Repositrio R/3, e no possvel executar where-used list.
Data: 26/09/06
Classes locais e interfaces so somente conhecidas no programa onde elas foram definidas e implementadas. Classes locais e interfaces no esto armazenadas no Repositrio R/3 ( na tabela TADIR). Dessa forma no possvel acesso global.
ABAP Workbenck development tool:Class Builder Ferramenta para criao, testes e gerenciamento de classes globais e interfaces
Armazenamento de Repositrio Gerao de cdigo framework, por exemplo CLASS <nome> DEFINITION.
Namespaces customizveis para classes e interfaces: Y* ou Z*. Utilizao Where-used list disponvel.
Data: 26/09/06
Diferentemente de classes e interfaces locais, classes globais e interfaces pode ser criadas e implementadas usando ABAP Workbench tool Class Builder.E estas classes estaro disponveis em todo ambiente R/3. Nomes de classes globais e interfaces so compartilhados com o mesmo namespace. Mtodos individuais de classes globais podem ser transportados separadamente.
Data: 26/09/06
As classes e interfaces podem ser visualizadas no Objetc Navigator (SE80). possvel criar e visualizar as classes atravs do Objetc Navigator (SE80). Para criar, selecione por exemplo, a opo pacote e clique com boto direito e selecione a opo biblioteca de classes. Voc tambm pode escolher a na SE80 a Classe/Interface.
Data: 26/09/06
Entre com o nome da Classe e sua descrio, em seguida ser necessrio informar o pacote. Ser exibida uma caixa de dilogo para informar maiores detalhes: - Gerao de Instancia: Onde as instancias sero criadas? - Por exemplo, se voc especificar Privado a classe somente poder ser instanciado dentro da prpria classe, o default Pblico. - Classe de Exceo: ( Ser discutido depois ). - Classe Persistente: ( Ser discutido depois ). - Classe Final ( Representa o fim de uma arvore de herana. - S Modelado ( Definio de Classe por modelo). ]
Definindo Atributos
Data: 26/09/06
No Class Builder, escolhendo a opo TAB Atributo de uma classe possvel visualizar os atributos da classe.
Data: 26/09/06
Tab Interfaces
Data: 26/09/06
Interfaces Globais que so criadas no Class Builder podem ser anunciadas em servidor de classes pela escolha da Interfaces TAB. Todos os mtodos de interfaces so automaticamente listados na TAB Mtodos. Todos os mtodos devem ser implementados no servidor de classes. Para este exemplo, a interface ZIF_FLY consiste de simples mtodo start.
Data: 26/09/06
Data: 26/09/06
Nas implementaes dos mtodos possvel utilizar o boto assinatura para exibir os parmetros que devem ser importados para ajudar no desenvolvimento do cdigo. Para este caso, os parmetros im_name e im_planetype.
Data: 26/09/06
possvel visualizar os relacionamentos entre as superclasses e subclasses atravs da TAB Caractersticas. No exemplo acima, a classe ZCL_CARGO_PLANE recebe a herana da classe ZCL_AIRPLANE.
Data: 26/09/06
Data: 26/09/06
Utilizando o a ferramenta de teste possvel criar instancias da classe, preencher os atributos e executar os mtodos.
Quando arrastada a classe transferida as definies semelhante a opo do boto MODELO. Clicando com o boto esquerdo da classe arrraste at o Editor do programa na SE80.
Data: 26/09/06
Um recurso interessante do Object Navigator (SE80) a opo e de arrastar objetos, como classes, mtodos no editor ABAP e visualizando as classes e mtodos, conforme a o slide acima.
Arrastando o objeto ZCL_AIRPLANE para o Editor ABAP do lado direito, inserido cdigo para criao da instancia do objeto e seus parmetros de assinaturas do mtodo CONSTRUCTOR.
Data: 26/09/06
O slide acima mostra como fcil a utilizao, por exemplo para criao do comando OBJECT CREATE, atravs do drag & drop com mouse.No exemplo foi selecionado o objeto(classe) ZCL_AIRPLANE e quando arrastado foi criado um template para instancia. OBS: Os caracteres X so onde devem ser preenchidos o nome da instancia.
Selecione o mtodo desejado e arraste para o editor ABAP para exibir a chamada do mtodo.
Data: 26/09/06
Da mesma forma que possvel a criao de objetos(instancias), tambm possvel arrastar os mtodos. No exemplo acima, foi selecionado o mtodo DISPLAY_ATTRIBUTES do lado esquerdo da tela e quando arrastado para o lado direito, foi inserido o comando CALL METHOD do mtodo selecionado. OBS: Para o caso de drag & drop para mtodos os caracteres X a instancia criada com o comando OBJECT CREATE.
1.3
Teste a classe na Ferramenta de Teste na SE24 ou SE80. Utilizando o programa do exerccio anterior ZBXOO_EVE_MAIN_00 implementar o seguinte cdigo: - Declarar um objeto r_hotel do tipo ZCL_HOTEL_XX - Criar o objeto importando os parmetros do constructor (IM_NAME e IM_BEDS), por exemplo: name = HILTOM e max_beds como 320. - Chamar o mtodo display_attributes para exibir os atributos
RESPOSTAS EXERCCIOS: 1. 1.1 1.2 Classes Globais A resposta para este exerccio est na classe ZCL_HOTEL_00. esposta para o programa principal est abaixo e as alteraes em negrito.
*&---------------------------------------------------------------------* *& Report ZBXOO_CLSS_MAIN_00 *& * *&---------------------------------------------------------------------* *& * *& * *&---------------------------------------------------------------------* REPORT ZBXOO_CLSS_MAIN_00 TYPE-POOLS icon. INCLUDE ZBXOO_INT_00. INCLUDE ZBXOO_EVE_00. DATA: r_plane TYPE REF TO lcl_airplane, .
DATA: count TYPE i. START-OF-SELECTION. CREATE OBJECT r_carrier EXPORTING im_name = 'Smile$Fly-Travel'. CREATE OBJECT r_agency EXPORTING im_name = 'CVC - Turismo'. *r_agency->add_partner( r_carrier ). CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin' im_planetype = '747-400' im_seats = 345. CREATE OBJECT r_cargo EXPORTING im_name = 'AA New York' im_planetype = '747-300' im_maxcargo = 533. *r_carrier->add_airplane( r_passenger ). * *r_carrier->add_airplane( r_cargo ). CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_agency EXPORTING im_name = 'CVC'. CREATE OBJECT r_rental EXPORTING im_name = 'RENT A CAR'. CREATE OBJECT r_truck EXPORTING im_name = 'MACK' im_cargo = '458'. r_rental->add_vehicle( r_truck ). CREATE OBJECT r_bus EXPORTING im_name = 'MERCEDES' im_passengers = '80'. r_rental->add_vehicle( r_bus ). CREATE OBJECT r_truck EXPORTING im_name = 'VOLVO' im_cargo = '48'.
CREATE OBJECT r_hotel EXPORTING im_name = 'HILTOM HOTEL' im_beds = 320. . r_rental->add_vehicle( r_truck ). r_agency->add_partner( r_rental ). r_carrier->display_atributes( ). r_agency->display_agency_partners( ). r_hotel->display_attributes( ).
Classes Abstratas
Classes Abstratas no podem ser instanciadas, mas podem ser instanciadas pelas Subclasses. Classes Abstratas so semelhantes as Interfaces Mtodos de Instancias de classes abstratas so definidos na classes, mas no podem ser implementados.
Os mtodos devem ser redefinidos
CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS estimate_fuel_consumption ABSTRACT IMPORTING...... ENDCLASS.
Mtodos no podem ser implementados na prpria classe. A classe abstrata no pode ser instanciada
Data: 26/09/06
As classes abstratas no podem ser instanciadas, mas no significa que no tem uso. No entanto, classes abstratas podem ter grande utilizao em subclasses. Classes Abstratas geralmente so usadas para declaraes incompletas de subclasses, ou seja, nonabstract subclasses. Os mtodos de classes abstratas no podem ser implementados na prpria classe, somente podem ser redefinidos nas subclasses. Classes com pelo menos um mtodo abstrato so abstratas Mtodos Estticos e Construtores no podem ser abstratos e tambm no podem ser redefinidos.
Classe Final
Data: 26/09/06
Uma classe final no pode ter subclasses, e dessa forma ela pode proteger ela mesma,(o descontrole) especializao. Algumas caractersticas: - Uma classe final implicitamente somente contm mtodos finais. Neste caso, voc no pode definir um mtodo, como um mtodo final.
Friends
Classes Friends
Classes Friends um conceito onde outras classes podem ver componentes, incluindo componentes ( rivate e Protected) P
Acesso direto para os dados da classe provendo, relacionamento entre estas classes Mtodos pode ser visveis em diversas classes.
Data: 26/09/06
O conceito de classes Friends permite acesso de componentes PRIVATE e PROTECTED, permitindo que todas as classes que sejam Friends possam visualizar estes componentes. Este conceito somente de um lado. A classe provedora no automaticamente uma Friend das Friends de si mesma. Se uma classe prove relacionamento Friend e necessrio acessar componentes que no so pblicos de uma Friend, esta Friend tem que explicitamente prover relacionamento para ela.
Servios Persistentes
Servios Persistentes
Os servios persistentes geram as informa es de Orientao a Objeto em banco de dados. Os objetos em runtime so transferidos quando o programa parado, ento os dados so gravados.
Data: 26/09/06
Data: 26/09/06
Classes Persistentes somente podem ser criadas no Class Builder. No momento da criao de uma classe persistente, o Classe Builder cria uma classe correspondente, chamada de class actor ou agent, os mtodos de quais sero usados para gerenciar os objetos de uma classe persistente.
Classe Agent
Classe Agent
Com os servios persistentes, a classe actor ou agent gerencia os objetos persistentes. Este agente atribui um range de servi os com mtodos, para gerenciar os objetos e dados encapsulados.
DATA: o_carrrier TYPE REF TO cl_carrier, o_agent TYPE REF TO ca_carrier, carrname TYPE s_carrname. r_agent = ca_carrier=>agent.
Data: 26/09/06
Para cara classes persistente criada no Class Builder, ele gera duas adicionais classes ca_persistent e cb_persistent. A classe ca_persistent a classe actor ou agent, no qual gerencia os objetos de uma classe cl_persistent, no qual todos acessos de database tomam seus lugares. A classe actor herda os mtodos da classe abstrata cb_persistent. Ainda possvel redefinir estes mtodos para modificar acessos as bases de dados. A superclasse cb_persistent no pode ser modificada. A classe actor uma Friend da classe gerenciada. Ela tem um atributo CREATE PRIVATE e exatamente uma instancia de uma classe actor criada quando acessada. O atributo AGENT uma varivel de referencia com o tipo de classe ca_persistent. Quando o atributo acessado pela primeira vez no programa, o construtor esttico de uma ca_persistent cria exatamente uma instancia de uma classe, com um ponteiro para o atributo AGENT. Este objeto parte de um servio persistente e este mtodo usado para gerenciar os objetos da classe persistente. Para cada programa existe somente um objeto da classe ca_persistent, por que voc no pode criar o objetos sem usar o CREATE OBJECT.
Manipulado Excees
Contedo
Definio de Excees (Exception Handling) Raising e Handling com classes predefinidas.
Data: 26/09/06
Exceptions (Execes)
REPORT ZDEMO. .... RAISE EXCEPTION TYPE cx_exception EXPORTING erro1 = ... erro2 = ...
Data: 26/09/06
Manipular excees um procedimento no cdigo de linguagens para capturar erros no previstos, ou possveis erros que possam ser pr-definidos, exemplos diviso por zero, overflow. O conceito de classes de excees est disponvel desde a verso Sap Basis 6.10. Sendo possvel visualizar estas classes com extenso CX, exemplo CX_ROOT que a superclasse de exceo. O comando RAISE EXCEPTION conforme o slide acima, captura um erro atravs da classe de exemplo ZCX_EXCEPTION. Conforme o exemplo, possvel desenvolver classes Z de exceptions, ou utilizar as classes Standard de excees, CX_ROOT, CX_SY_ZERODIVIDE. Com a Orientao a Objetos manipular excees de extrema importncia para tratamento de erros. Pois se ocorre um erro no programa em tempo de execuo, este consegue ser capturado o erro e pode ser tratado.
Exceptions (Excees)
cx _no_check
cx _dynam _check ic
cx _static _check
cx _sy_zerodivide
Data: 26/09/06
As classes de excees derivam da superclasse CX_ROOT. O slide acima mostra a hierarquia das classes de excees e suas principais subclasses. As classes de excees sempre comeam com CX_ para classes globais, mas tambm possvel definir classes locais. No exemplo do slide acima a classe CX_ROOT tem dois mtodos que so herdados para as subclasses. O mtodo GET_SOURCE_POSITION retorna o nome do programa e o mtodo GET_TEXT retorna um texto de exceo de uma classe em forma de string. Todas as classes de excees possuem atributo KERNEL_ERRID que contm o nome do erro em runtime. Isto somente ocorre se houve uma captura de alguns para a classe instanciada.
TRY. .... CATCH cx_root INTO o_root. o_roor->get_text CATCH cx_sy_arithmetic_error INTO o_aritmetic. o_aritmetic->get_text CLEANUP. .... ENDTRY.
CLEANUP trecho do comando TRY onde possvel Executar algum cdigo depois do Exception.
Data: 26/09/06
O comando TRY importante comando para capturar excees em linguagens de Orientaes a Objetos, como Delphi, JAVA e .NET. Ele somente est disponvel a partir da verso SAP BASIS 6.10 e a verso SAP APP 4.7. Ele executado em blocos conforme o slide acima. E se uma exception ocorre o bloco TRY procura por uma declarao CATCH, onde a poder manipular uma exceo. Se ele no encontrar um exceo de manipulao no TRY-ENDTRY, ele ento passa a exceo para programa. O bloco CATCH contm excees que so executadas se uma especfica exceo ocorreu no bloco TRY. Depois do bloco possvel especificar outras classes de excees. Depois que a exceo ocorre, o sistema procura todas as excees declaradas no CATCH e a executa. Alguns casos, a exceo no encontrada e ento a exceo passada para o programa e block CLEANUP executado. O CLEANUP opcional, mas ele tem uma importante funo no controle de fluxo de manipulaes, pois neste trecho de bloco possvel, voltar um estado de algum objeto, no caso de conexes com Banco de Dados ele pode fechar a conexo. O bloco CLEANUP tem a mesma funo do FINALY no JAVA.
REPORT ZBX00. DATA: resultado texto o_root TYPE I. TYPE STRING, TYPE CX_ROOT.
TRY. resultado = var1 * var2. CATCH cx_sy_arihtmetic_overflow INTO o_root. texto = o_roor->get_text WRITE texto. CLEANUP. .... ENDTRY.
Se ocorrer um overflow na varivel resultado, ser capturada a exceo atravs da classe CX_SY_ARITMETIC_ERROR e no ocorrer o DUMP.
Data: 26/09/06
No slide acima, se ocorrer um overflow na varivel resultado do tipo I , o runtime captura uma exceo CX_SY_ARITHMETIC_OVERFLOW no bloco CATCH. O objeto o_root recebe a instancia da classe de exceo, e ento possvel exibir o contedo do erro atravs do mtodo GET_TEXT que herdado da classe CX_ROOT. A classe CX_SY_ARITHMETIC_OVERFLOW, CX_SY_ARITHMETIC_ERROR e CX_DYNAMIC_CHECK so subclasses da superclasse CX_ROOT.
CLASS lcl_airplane DEFINITION. ... METHODS get_techical_attrinutes IMPORTING EXEPORTING ... ENDCLASS.
CLASS lcl_airplane IMPLEMENTION. ... METHODS get_techical_attrinutes SELECT SINGLE weight tankcap FROM saplane INTO ( ex_weight, ex_tankcap) WHERE planetype = im_type. IF sy_subrc <> 0. ex_weigth = 100000. ex_tankcap = 10000. ENDIF. ... ENDCLASS.
Data: 26/09/06
O cdigo acima mostra o mtodo get_technical_attributes de uma classe lcl_airplane, com a sua implementao. Ele importa o parmetro im_planetype e retorna weigth e tank. Analisando a implementao do mtodo acima, retorna os parmetros weight = 1000000 e tankcap = 10000, caso no seja encontrado na tabela. Isto pode ser melhorado, implementando uma exceo para tratar, caso o SY_SUBRC seja diferente de 0.
Data: 26/09/06
possvel criar classes globais de excees na SE24, conforme o slide acima. Geralmente as classes de excees so geralmente classes globais e existe uma conveno de nomenclatura para este tipo de classes, onde para as classes iniciam com CX_ e para classes no standards, devem comear com ZCX_. Quando voc cria uma classe de exceo ela, herda da classe CX_STATIC_CHECK como default.
Data: 26/09/06
Todos os componentes (Atributos e Mtodos) da classe CX_ROOT so herdados, ento voc pode adicionar novos componentes. Um construtor de instancia criado automaticamente. Tambm podem ser definidos textos para as excees na TAB TEXT como um ID de exceo. O mtodo GET_TEXT exporta este TEXT ID.
Data: 26/09/06
Com a clausula TRY e RAISE no slide acima, se tipo de airplane for passado de forma incorreta, atravs da classe de exceo desenvolvida, caso o SY-SUBRC seja diferente de 0. Dentro do bloco TRY existe a clausula RAISE importando o parmetro pl_type do constructor e assim automaticamente gera a exceo. Ento possvel capturar a exceo e capturar TEXTID.
Passando Exceptions
CLASS lcl_airplane IMPLEMENTATION. METHODS metodo. RAISE EXCEPTION TYPE cx_exception. ENDMETHOD. ENDCLASS.
CLASS lcl_airplane DEFINITION. METHODS method IMPORTING <im_parameters> EXPORTING <ex_parameter> RAISING cx_exception. ENDCLASS.
REPORT ZCX_ERROR. DATA o_obj TYPE REF TO class. ... TRY o_obj->metodo ( ). CATCH cx_exception. ENDTRY.
Data: 26/09/06
As excees que ocorrem em procedures( mtodos, funes, reports e subrotinas) podem ser transferidas para outro programa, ou include, conforme exemplo acima. Para passar excees de uma procedure, voc geralmente usa o RAISING. Se for uma classe local, o RAISING deve ser especificado no mtodo com a sintaxe na definio da classe acima.
Passando Exceptions
c _ro t x o -te tid x +g t _te t () e x
c _n _c e k x o hc
c _d n m x y a ic
_c e k hc
c _s tic _c e k x ta hc
Voc pode manipular estas excees. Se voc no criar a manipulao, ela passada automaticamente. Voc no pode passar usando RAISING. Sem parte de syntax check
Voc pode manipular estas excees ou passar como RAISING. Sem parte de syntax_check
Voc pode manipular estas excees ou passar como RAISING. Parte de syntax_check
Data: 26/09/06
CX_STATIC_CHECK. As excees dessas subclasses podem ser manipuladas, ou passadas explicitamente com RAISING. Ento, somente as excees que voc mesmo define no cdigo de sua aplicao so Subclasses de CX_STATIC_CHECK. CX_DYNAMIC_CHECK. As relevantes excees no tm que ser declaradas. Se uma exceo ocorre em runtime, somente como subclasses de CX_STATIC_CHECK, ela deve ser manipulada ou passada explicitamente usando RAISING. Entretanto, isto no verificado no syntax check. CX_NO_CHECK. Estas excees no podem ser declaradas. Estas excees podem ser manipuladas. Se no, elas podem ser passadas para o outro programa. A checagem de sintaxe nunca encontra um erro na manipulao. Todas as excees da categoria CX_NO_CHECK que no so manipuladas na chamada da hierarquia so automaticamente passadas para o nvel mais auto, se eles no capturados l, eles causam runtime error. Algumas predefinidas excees com o prefixo CX_SY para situaes de erros em ambiente runtime so subclasses de CX_NO_CHECK.
1.3 1.4
*&---------------------------------------------------------------------* *& Include ZBXOO_EVE_00 *&---------------------------------------------------------------------* *----------------------------------------------------------------------* * CLASS lcl_airplane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_airplane DEFINITION. PUBLIC SECTION. CONSTANTS: pos_1 TYPE i VALUE 30. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype, display_atributes. CLASS-METHODS: display_n_o_airplanes. EVENTS airplane_created. PRIVATE SECTION. DATA: name type string, planetype type saplane-planetype, weight type saplane-weight, tankcap type saplane-tankcap. CLASS-DATA: n_o_airplanes type i. METHODS: get_technical_atributes IMPORTING im_planetype type saplane-planetype EXPORTING ex_weight type saplane-weight ex_tankcap type saplane-tankcap RAISING ZCX_WRONG_PLANETYPE. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_airplane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_airplane IMPLEMENTATION.
*----------------------------------------------------------------------* * CLASS lcl_cargo_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_cargo_plane IMPLEMENTATION. METHOD: constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_cargo = im_maxcargo. ENDMETHOD. METHOD: display_atributes. CALL METHOD super->display_atributes( ). WRITE: / 'Max Cargo = ', max_cargo. ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_passenger_plane DEFINITION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane DEFINITION INHERITING FROM lcl_airplane. PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string im_planetype TYPE saplane-planetype
display_atributes REDEFINITION. PRIVATE SECTION. DATA: max_seats TYPE sflight-seatsmax. ENDCLASS. *----------------------------------------------------------------------* * CLASS lcl_passenger_plane IMPLEMENTATION. *----------------------------------------------------------------------* CLASS lcl_passenger_plane IMPLEMENTATION. METHOD constructor. CALL METHOD super->constructor( im_name = im_name im_planetype = im_planetype ). max_seats = im_seats. ENDMETHOD. METHOD display_atributes. CALL METHOD super->display_atributes( ). WRITE: / 'Max Seats = ', max_seats. ENDMETHOD.
ENDCLASS.
*----------------------------------------------------------------------* * CLASS lcl_carrier DEFINITION. *----------------------------------------------------------------------* CLASS lcl_carrier DEFINITION . PUBLIC SECTION. METHODS: constructor IMPORTING im_name TYPE string, get_name RETURNING value(ex_name) TYPE string, add_airplane FOR EVENT airplane_created of lcl_airplane IMPORTING sender, display_airplanes, display_atributes. PRIVATE SECTION. DATA: name TYPE string, airplane_list TYPE TABLE OF REF TO lcl_airplane.
DATA: count TYPE i. START-OF-SELECTION. CREATE OBJECT r_carrier EXPORTING im_name = 'Smile$Fly-Travel'. CREATE OBJECT r_agency EXPORTING im_name = 'CVC - Turismo'. *r_agency->add_partner( r_carrier ). CREATE OBJECT r_passenger EXPORTING im_name = 'LH Berlin' im_planetype = '747-400' im_seats = 345. CREATE OBJECT r_cargo EXPORTING im_name = 'AA New York' im_planetype = '747-300' im_maxcargo = 533. *r_carrier->add_airplane( r_passenger ). * *r_carrier->add_airplane( r_cargo ). CALL METHOD lcl_airplane=>display_n_o_airplanes( ). CREATE OBJECT r_agency EXPORTING im_name = 'CVC'. CREATE OBJECT r_rental EXPORTING im_name = 'RENT A CAR'. CREATE OBJECT r_truck EXPORTING im_name = 'MACK' im_cargo = '458'. r_rental->add_vehicle( r_truck ). CREATE OBJECT r_bus EXPORTING im_name = 'MERCEDES' im_passengers = '80'. r_rental->add_vehicle( r_bus ). CREATE OBJECT r_truck EXPORTING im_name = 'VOLVO' im_cargo = '48'.
12. EXERCCIO EXTRA EXERCCIOS: 1. 1.1 1.2 1.3 Criao de Arquivo XML Criar um programa ZBXXX_XML de acordo o grupo. Incluir a declarao TYPE-POOLS: ixml para biblioteca ixml. Declarar as seguintes estruturas para gerar a estrutura XML. l_ixml l_streamfactory l_ostream l_renderer l_document 1.4 TYPE TYPE TYPE TYPE TYPE REF REF REF REF REF TO TO TO TO TO if_ixml, if_ixml_stream_factory, if_ixml_ostream, if_ixml_renderer, if_ixml_document.
Declarar as seguintes estruturas abaixo para gerar elementos do XML. l_element_flights l_element_airline l_element_flight l_element_from l_element_to l_element_dummy l_value l_value2(50) TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, string, c.
1.5
Declarar as seguintes estruturas abaixo para seleo dos dados e armazenamento XML. l_xml_table l_xml_size l_rc lt_spfli l_spfli TYPE TABLE OF xml_line, TYPE i, TYPE i. TYPE TABLE OF spfli. TYPE spfli.
1.6
Declarar as variveis abaixo para utilizao de gravao do arquivo. w_filename TYPE string, w_path TYPE string, w_fullpath TYPE string, w_rc TYPE i, w_title TYPE string.
1.7
Utilizar o mtodo esttico da classe cl_gui_frontend_services=>file_save_dialog, para exibir a caixa de dilogo para solicitar a local de gravao de arquivo. Informando os parmetros: EXPORTING window_title DEFAULT_FILE_NAME initial_directory CHANGING filename path fullpath EXCEPTIONS cntl_error error_no_gui not_supported_by_gui OTHERS = 'Gravar arq XML' = 'C:\Temp\flights.xml' = 'C:\Temp\' = w_filename = w_path = w_fullpath = = = = 1 2 3 4
Criar um evento START-OF-SELECTION. Fazer um select na tabela spfli e grav-lo em lt_spfli. Ordenar a tabela interna lt_spfli por CARRID. Criar um LOOP na tabela j preenchida e atribuir a work rea a varivel l_spfli. Carregar a definio da classe CL_IXML com o comando CLASS <classe a ser carregada> DEFINITION. No comando AT FIRST do LOOP implementar o seguinte cdigo: - Criar um ixml factory (Referencia de um Objeto) , atribuindo o mtodo esttico CREATE() da classe CL_IXML para o objeto l_ixml. - Criar dom object model XML ( Instancia do Objeto ) , atribuindo o mtodo de instancia ( CREATE_DOCUMENT) da referencia l_ixml para o objeto l_document. - Com o objeto l_document criado. Cria o root node com os valores flights, utlizando o mtodo create_simple_element, passado como parmetros ( name = flight_OO e parent = l_document ). - Finalizar ENDAT.
1.14Implementar o comando AT NEW carrid do LOOP o seguinte cdigo: - Criar elementos 'airline' como child de 'flights', utilizando o objeto l_document com o mtodo create_simple_element, passado como parmetros ( name = airline e parent = l_element_flights ). - Atribuir o campo l_spfli-carrid a varivel l_value. - Atribuir o mtodo set_attribute do objeto l_element_airline a varivel l_rc, passando os parmetros (name = 'code' value =l_value ). Para criar o atributo name. - Incluir um SELECT SINGLE da tabela scarr selecionado o campo carrname gravando em l_value2, onde carrid igual a l_spfli-carrid. - Atribuir l_value2 a l_value. - Atribuir o mtodo set_attribute do objeto l_element_airline a varivel l_rc, passando os parmetros (name = 'code' value =l_value ). Para criar o atributo name. - Finalizar ENDAT. Treinamento ABAP Objetcs
Documento de propriedade da Braxis IT Services Proibida a reproduo sem autorizao
1.15Implementar o comando AT NEW connid do LOOP o seguinte cdigo: - Criar elemento 'flight' como child de 'airline', utilizando o objeto l_document com o mtodo create_simple_element, passado como parmetros ( name = flight e parent = l_element_airline ). - Atribuir _spfli-connid a l_value. - Atribuir o mtodo set_attribute do objeto l_element_flight a varivel l_rc, passando os parmetros (name = 'number' value =l_value ). Para criar o atributo name. - Finalizar ENDAT. 1.16 No corpo do LOOP definir os seguintes mtodos: - Concatenar l_spfli-cityfrom e l_spfli-countryfr e atribuir a l_value. - Utilizando o objeto l_document com o mtodo create_simple_element atribua ao l_element_from, passado como parmetros ( name = from, value = l_value e parent = l_element_flight ) - Atribuir l_spfli-airpfrom para l_value. - Atribuir o mtodo set_attribute do objeto l_element_from a varivel l_rc, passando os parmetros (name = 'airport' value =l_value ). Para criar o atributo name. - Concatenar l_spfli-cityto e l_spfli-countryto e gravar em l_value. - Utilizando o objeto l_document com o mtodo create_simple_element atribua ao l_element_from, passado como parmetros ( name = to, value = l_value e parent = l_element_flight ) - Atribuir l_spfli-airpto a l_value. - Atribuir o mtodo set_attribute do objeto l_element_to a varivel l_rc, passando os parmetros (name = 'airport' value =l_value ). Para criar o atributo name. - Atribuir l_spfli-deptime ao l_value. - Utilizando o objeto l_document com o mtodo create_simple_element atribua ao l_element_from, passado como parmetros ( name = departure, value = l_value e parent = l_element_flight ) - Atribuir l_spfli-arrtime ao l_value. - Utilizando o objeto l_document com o mtodo create_simple_element atribua ao l_element_from, passado como parmetros ( name = arrival, value = l_value e parent = l_element_flight ). - Finalizar LOOP.
1.17
Implementar o seguinte cdigo para carregar o XML Stream. - Criar um stream factory, atribuindo o mtodo create_stream_factory do objeto l_ixml para o objeto l_streamfactory. - Conectar Tabela XML para o stream factory atravs da declarao abaixo: l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). - Normalizar o documento XML atravs da declarao abaixo: l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). - Utilizar o mtodo get_num_written_raw do objeto l_ostream e atribuir em l_xml_size, para obter o tamanho do XML.
*--------------------------------------------------------------------* *& Report ZBX00_XML * *& * *&---------------------------------------------------------------------* *& Exerccio para gerao de Arquivo XML - Curso ABAP Objects * *& Autor: Fbio Ferri * *&---------------------------------------------------------------------* REPORT zbx00_xml TYPE-POOLS: ixml. TYPES: BEGIN OF xml_line, data(256) TYPE x, END OF xml_line. DATA: l_ixml l_streamfactory l_ostream l_renderer l_document DATA: l_element_flights l_element_airline l_element_flight l_element_from l_element_to l_element_dummy l_value l_value2(50) DATA: l_xml_table TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE TYPE REF REF REF REF REF TO TO TO TO TO if_ixml, if_ixml_stream_factory, if_ixml_ostream, if_ixml_renderer, if_ixml_document. .
REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, REF TO if_ixml_element, string, c.
DATA: w_filename TYPE string, w_path TYPE string, w_fullpath TYPE string, w_rc TYPE i, w_title TYPE string. * Utilizar o mtodo file_save_dialog para escolher onde salvar * o arquivo. CALL METHOD cl_gui_frontend_services=>file_save_dialog EXPORTING window_title = 'Gravar arq XML' * DEFAULT_EXTENSION = * DEFAULT_FILE_NAME = 'C:\Temp\flights.xml' * FILE_FILTER = initial_directory = 'C:\Temp\' * WITH_ENCODING = * PROMPT_ON_OVERWRITE = 'X' CHANGING filename = w_filename path = w_path fullpath = w_fullpath * USER_ACTION = * FILE_ENCODING = EXCEPTIONS cntl_error = 1 error_no_gui = 2 not_supported_by_gui = 3 OTHERS = 4 . IF sy-subrc <> 0. MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4. ENDIF.
START-OF-SELECTION. * Selecionar dados em SPFLI SELECT * FROM spfli INTO TABLE lt_spfli. * * Ordenar dados em SPFLI SORT lt_spfli BY carrid. LOOP para gerar o XML LOOP AT lt_spfli INTO l_spfli. AT FIRST.
Criar atributo 'code' do node 'airline' l_value = l_spfli-carrid. l_rc = l_element_airline->set_attribute( name = 'code' value = l_value ). * Criar atributo 'name' do node 'airline' SELECT SINGLE carrname FROM scarr INTO l_value2 WHERE carrid EQ l_spfli-carrid. l_value = l_value2. l_rc = l_element_airline->set_attribute( name = 'name' value = l_value ). ENDAT. * AT NEW connid. Criar elemento 'flight' como child of 'airline' l_element_flight = l_document->create_simple_element( name = 'flight' parent = l_element_airline ).
Criar atributo 'number' de node 'flight' l_value = l_spfli-connid. l_rc = l_element_flight->set_attribute( name = 'number' value = l_value ). ENDAT. * Criar elemento 'from' como child de 'flight' CONCATENATE l_spfli-cityfrom ',' l_spfli-countryfr INTO l_value. l_element_from = l_document->create_simple_element( name = 'from' value = l_value parent = l_element_flight ). Criar atribute 'airport' do node 'from' l_value = l_spfli-airpfrom. l_rc = l_element_from->set_attribute( name = 'airport' value =
Criar atributo 'airport' do node 'from' l_value = l_spfli-airpto. l_rc = l_element_to->set_attribute( name = 'airport' value = l_value ). * Criar elemento 'departure' como child de 'flight' l_value = l_spfli-deptime. l_element_dummy = l_document->create_simple_element( name = 'departure' value = l_value parent = l_element_flight ). Criar elemento 'arrival' como child de 'flight' l_value = l_spfli-arrtime. l_element_dummy = l_document->create_simple_element( name = 'arrival' value = l_value parent = l_element_flight ). ENDLOOP. * Criando um stream factory l_streamfactory = l_ixml->create_stream_factory( ). * Conectar Tabela XML para o stream factory * ele criar a saida de stream do XML l_ostream = l_streamfactory->create_ostream_itable( table = l_xml_table ). * Rendering ( Normaliza o documento XML) o documento l_renderer = l_ixml->create_renderer( ostream = l_ostream document = l_document ). l_rc = l_renderer->render( ). Salvar o arquivo XML document l_xml_size = l_ostream->get_num_written_raw( ). CALL METHOD cl_gui_frontend_services=>gui_download EXPORTING bin_filesize = l_xml_size filename = w_fullpath filetype = 'BIN' CHANGING data_tab = l_xml_table EXCEPTIONS file_write_error = 1 no_batch = 2
13. TESTES Com o objetivo de avaliar o que voc aprendeu no curso, segue abaixo alguns testes para voc se auto-avaliar sobre seu conhecimento em ABAP Objects. As perguntas tm mltiplas respostas, onde podem conter apenas uma reposta correta, ou todas as respostas corretas, ou todas as respostas incorretas. 1) Pergunta 1 O que uma instancia de uma classe? Resposta 1 um atributo pblico que pode ser referenciado. Resposta 2 uma referencia de memria de um objeto. Resposta 3 uma referencia de memria de classe com atributos estticos. Resposta 4 uma chamada de uma classe sem necessidade do CREATE OBJETC.
2) Pergunta 2 O que verdade sobre Orientao a Objeto? Resposta 1 As linguagens orientadas a objeto representam melhor o mundo real, do que as linguagens procedurais. Resposta 2 possvel utilizao de objetos, ou classes, mas outros aplicativos podem acessar somente um nico objeto por vez. Resposta 3 Atravs da UML e a forma de documentao dos objetos, existe uma melhoria na estrutura do software desenvolvido. Resposta 4 Reduz custos de manuteno e desenvolvimento.
Respostas pgina anterior: Pergunta 1 O que uma instancia de uma classe? Resposta 1 Errada: Resposta 2 Correta: Resposta 3 Errada: Resposta 4 Errada:
Pergunta 2 O que verdade sobre Orientao a Objeto? Resposta 1 Correta: Resposta 2 Errada: Resposta 3 Correta: Resposta 4 Correta:
4) Pergunta 4 O que verdade em UML? Resposta 1 um padro aberto de modelagem de linguagens Orientadas o Objeto, permitindo especificao, construo, visualizao e documentao de modelos de software. Resposta 2 Em UML, uma classe possui: Nome da Classe, Atributos, Mtodos, e Eventos. Resposta 3 Atributos e Mtodos descrevem as caractersticas de um objeto do mundo real. Resposta 4 A UML promove melhor maior qualidade, documentao e principalmente garante os fortes conceitos de Orientao a Objetos.
Pergunta 4 O que verdade em UML? Resposta 1 Correta: Resposta 2 Errada: Resposta 3 Correta: Resposta 4 Correta:
Pergunta 8 O que verdade sobre Atributo Esttico? Resposta 1 Errada: Resposta 2 Correta: Resposta 3 Correta: Resposta 4 Errada:
Pergunta 12 O que verdade sobre Redefinio? Resposta 1 Errada: Resposta 2 Correta: Resposta 3 Errada: Resposta 4 Correta:
Pergunta 14 O que verdade sobre Eventos? Resposta 1 Correta: Resposta 2 Correta: Resposta 3 Correta: Resposta 4 Correta: