Você está na página 1de 340

BC401

ABAP Objects

.
.
MANUAL DO PARTICIPANTE
TREINAMENTO CONDUZIDO PELO INSTRUTOR
.
Versão do curso: 18
Duração do curso: 5 Dias
Número de material: 50148232

Esteja ciente de que este curso foi traduzido por uma máquina e por isso pode não ter
a mesma precisão de uma tradução humana. Em caso de dúvida, consulte a versão em
inglês dos EUA.
SAP Direitos autorais, marcas
registradas e isenções de
responsabilidade da SAP

© 2022 SAP SE ou empresa afiliada da SAP. Todos os direitos reservados.

Nenhuma parte desta publicação pode ser reproduzida ou transmitida de alguma


forma ou com qualquer finalidade sem a autorização expressa da SAP SE ou de uma
empresa afiliada da SAP.
As informações contidas neste documento podem ser alteradas sem notificação
prévia. Alguns produtos de software comercializados pela SAP SE e por seus
distribuidores contêm componentes de software exclusivos de outros fornecedores.
As especificações nacionais dos produtos podem variar.
Estes materiais podem ter sido traduzidos automaticamente e podem conter erros
gramaticais ou imprecisões.
Estes materiais são fornecidos pela SAP SE ou por empresas afiliadas da SAP com
propósito meramente informativo, sem declaração ou garantia de qualquer espécie,
assim a SAP ou suas empresas afiliadas não se responsabilizam por erros ou
omissões relativos aos mesmos. As únicas garantias pelos produtos ou serviços da
SAP SE ou das empresas afiliadas da SAP são as explicitamente especificadas em
declarações de garantia contidas nos respectivos produtos e serviços, quando
cabíveis. Seu conteúdo não deve ser interpretado como constituição de garantia
adicional.
Especificamente, a SAP SE ou suas empresas afiliadas não estão obrigadas a seguir
nenhuma direção no curso dos negócios especificada neste documento ou em
qualquer apresentação relacionada, nem a desenvolver ou lançar qualquer
funcionalidade ali especificada. Este documento, ou qualquer apresentação a ele
relacionada, e a estratégia e possíveis futuros desenvolvimentos, produtos e/ou
direções e funcionalidade de plataforma da SAP SE ou de suas empresas afiliadas
estão sujeitos a alterações e podem ser alterados pela SAP SE ou por suas empresas
afiliadas a qualquer momento, por qualquer razão e sem prévio aviso. As
informações contidas neste documento não constituem compromisso, promessa ou
obrigação legal de fornecimento de qualquer material, código ou funcionalidade.
Qualquer declaração com vistas ao futuro está sujeita a vários riscos e incertezas que
podem produzir resultados efetivamente diferentes dos esperados. Os leitores ficam
alertados a não basear indevidamente suas decisões de compra nesse tipo de
declaração.
SAP e outros produtos e serviços da SAP aqui mencionados, bem como seus
respectivos logotipos são marcas comerciais ou registradas da SAP SE (ou de uma
empresa afiliada da SAP) na Alemanha ou em outros países. Todos os outros nomes
de produtos e serviços mencionados são marcas registradas de suas respectivas
empresas. Consulte https://www.sap.com/corporate/en/legal/copyright.html e
veja outros avisos e informações sobre a marca registrada.
Convenções tipográficas

Português brasileiro é o padrão usado neste manual.


As convenções tipográficas a seguir também são usadas.

Essas informações são exibidas na apresentação do instrutor

Demonstração

Procedimento

Advertência ou cuidado

Dica

Informações relacionadas ou adicionais

Título da janela

Controle da interface do usuário Texto de exemplo

Título da janela Texto de exemplo

© Direitos autorais. Todos os direitos reservados. iii


iv © Direitos autorais. Todos os direitos reservados.
Conteúdo

vii Síntese do curso

1 Capítulo 1 : Introdução à programação orientada a objetos

3 Lição: Explicação do modelo de programação orientado a objetos


15 Lição: Análise e design com Unified Modeling Language (UML)

33 Capítulo 2 : Sintaxe básica orientada a objetos

35 Lição: Criação de classes locais


49 Lição: Criar objetos
55 Lição: Acessar métodos e atributos
61 Lição: Implementação de construtores em classes locais
65 Lição: Implementação de construtores de classe em classes locais

77 Capítulo 3 : Herança e casting

79 Lição: Implementar herança


89 Lição: Implementar upcasts utilizando herança
93 Lição: Implementar polimorfismo utilizando herança
99 Lição: Implementação de downcasts utilizando herança

113 Capítulo 4 : Interfaces e casting

115 Lição: Definição e implementação de interfaces locais


121 Lição: Implementar polimorfismo utilizando interfaces
125 Lição: Integração de modelos de classe mediante interfaces

137 Capítulo 5 : Eventos orientados a objetos

139 Lição: Implementação de eventos em classes locais


149 Lição: Implementar eventos em interfaces locais

157 Capítulo 6 : Objetos do repositório orientados a objetos

159 Lição: Criação de classes globais


169 Lição: Definição e implementação de interfaces globais
175 Lição: Utilização de outras funções do Class Builder

187 Capítulo 7 : Exemplos de programação ABAP orientada a objetos

189 Lição: Utilizando o ABAP List Viewer (ALV)


197 Lição: Descrição de Business Add Ins (BAdIs)

211 Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

213 Lição: Desenvolvimento de programas ABAP com ferramentas


baseadas em Eclipse

© Direitos autorais. Todos os direitos reservados. v


227 Capítulo 9 : Exceções baseadas na classe

229 Lição: Explicação de exceções baseadas na classe


237 Lição: Definição e geração de exceções
247 Lição: Implementar técnicas avançadas de tratamento de exceções

263 Capítulo Teste funcional


10 :

265 Lição: Teste funcional com unidade ABAP

277 Capítulo Modelos de design orientados a objetos


11 :

279 Lição: Implementar técnicas avançadas orientadas a objetos


289 Lição: Implementação de métodos factory e padrões singleton
293 Lição: Implementação de classes factory utilizando amizade

303 Capítulo Serviços de tipo em tempo de execução


12 :

305 Lição: Utilizar identificação de tipo em tempo de execução (RTTI)

313 Capítulo Objetos persistentes e transações OO


13 :

315 Lição: Implementar objetos persistentes

325 Capítulo Criação de uma aplicação abrangente orientada a objetos


14 :

327 Lição: Desenvolvimento de uma aplicação abrangente orientada a


objetos

vi © Direitos autorais. Todos os direitos reservados.


Síntese do curso

PÚBLICO-ALVO
Este curso destina-se aos seguintes públicos:
● Consultor de aplicação
● Consultor de desenvolvimento
● Desenvolvedor

© Direitos autorais. Todos os direitos reservados. vii


viii © Direitos autorais. Todos os direitos reservados.
CAPÍTULO 1 Introdução à programação
orientada a objetos

Lição 1
Explicação do modelo de programação orientado a objetos 3

Lição 2
Análise e design com Unified Modeling Language (UML) 15

OBJETIVOS DO CAPÍTULO

● Descrever as diferenças entre os modelos de programação procedimental e orientado a


objetos
● Classificar objetos
● Modelo em UML

© Direitos autorais. Todos os direitos reservados. 1


Capítulo 1 : Introdução à programação orientada a objetos

2 © Direitos autorais. Todos os direitos reservados.


Capítulo 1
Lição 1
Explicação do modelo de programação
orientado a objetos

SÍNTESE DA LIÇÃO
Esta lição fornece uma síntese dos conceitos-chave da programação ABAP utilizando o
modelo orientado a objetos.

Exemplo de negócio
Você precisa explicar o modelo de programação orientado a objetos e suas vantagens para
seu gerente de projeto de desenvolvimento. Por esse motivo, você precisa:
● Compreensão da programação procedimental e orientada a objetos
● Compreensão de objetos ABAP

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Descrever as diferenças entre os modelos de programação procedimental e orientado a
objetos

Evolução do ABAP

Figura 1: Histórico das linguagens de programação selecionadas

© Direitos autorais. Todos os direitos reservados. 3


Capítulo 1 : Introdução à programação orientada a objetos

Como você pode ver na figura, o Histórico de linguagens de programação selecionadas, a


programação orientada a objetos (como a linguagem de programação Simula 67) e os
modelos de programação lógicos e procedimentais (como usados em linguagens como C e
Pascal) foram desenvolvidos ao mesmo tempo. Anteriormente, o COBOL e o modelo de
programação procedimental dominavam o desenvolvimento de aplicativos empresariais. A
SAP utilizou um montador de macros antes da criação de ABAP.
Ainda hoje, muitos desenvolvedores têm mais experiência com programação procedural do
que com programação orientada a objetos. Portanto, esta introdução faz referência ao
modelo processual ao explicar a programação orientada a objetos.
O ABAP foi criado para melhorar o reporting. Foi desenvolvido de forma independente como
uma linguagem de programação interna. Ele foi influenciado por outras linguagens de
programação, como COBOL e Pascal. Em seguida, o ABAP foi ampliado para formar objetos
ABAP. Portanto, os ABAP Objects unem elementos orientados a objetos e procedimentais em
uma linguagem de programação. Para a parte de programação orientada a objetos, o ABAP
Objects adotou conceitos orientados a objetos para o desenvolvimento de aplicações
empresariais em outras linguagens (por exemplo, Java, C++ e Smalltalk).

O modelo de programação processual

Figura 2: Folie 1

As variáveis globais para um programa contêm dados, enquanto as sub-rotinas contêm


funções.
Cada subprograma pode acessar todas as variáveis globais.

4 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação do modelo de programação orientado a objetos

Componentes de um programa ABAP procedural

Figura 3: Programa ABAP procedural típico

Um programa ABAP procedimental típico consiste em definições de tipo e declarações de


dados. As declarações de dados descrevem a estrutura de dados que o programa utiliza
durante a execução.
É possível encapsular a lógica em unidades de modularização (por exemplo, sub-rotinas ou
módulos de função). No entanto, no nível do programa principal, não existe nenhuma
proteção especial para os objetos de dados globais. É possível ler e alterar as variáveis globais
de qualquer lugar no programa.

© Direitos autorais. Todos os direitos reservados. 5


Capítulo 1 : Introdução à programação orientada a objetos

Encapsulação de dados por meio de grupos de funções

Figura 4: Encapsulamento de dados através de grupos de funções

Quando um módulo de função é chamado no programa principal, seu grupo de funções é


carregado para a sessão interna. O grupo de funções permanece ativo até que o programa
básico termine a execução. O sistema arquiva o programa principal e os grupos de funções
chamados em áreas de memória separadas. Mesmo que os objetos de dados dos grupos de
funções tenham os mesmos nomes de objeto de dados que no programa de chamada, eles
não compartilham o mesmo espaço de memória.
Nada é compartilhado, mesmo que os objetos de dados dos grupos de funções tenham o
mesmo nome. Não é possível acessar os dados globais de um grupo de funções diretamente
do programa principal. Você só pode chamar os módulos de função dos grupos de funções do
programa principal. Por sua vez, os módulos de função podem acessar outros componentes,
especialmente os dados globais de seu próprio grupo de funções.
O encapsulamento também usa a ideia de que a implementação de um serviço pode ser
ocultada de outros componentes do sistema. O motivo para isso é que os outros
componentes não podem nem precisam fazer suposições sobre o status interno da unidade
de modularização. Dessa forma, o design desses outros componentes não depende das
outras unidades de modularização que estão sendo implementadas de uma forma específica.
Um grupo de funções agrupa dados e funções que administram os dados. O acesso
encapsulado a dados e serviços é um dos muitos conceitos do modelo de programação
orientada a objetos. Por isso, este modelo de programação e a parte procedimental do ABAP
Objects suportam este encapsulamento. Ao implementar o Business Application
Programming Interface (BAPI), os BAPIs são implementados como módulos de função e os
business objects são implementados como grupos de funções.

6 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação do modelo de programação orientado a objetos

Grupos de funções

Figura 5: Exemplo de um grupo de funções

O grupo de funções S_VEHICLE fornece a um usuário ou mandante os serviços Inc_speed,


dec_speed e get_speed. Estes serviços são a interface do grupo de funções. Todos eles têm
acesso à velocidade do objeto de dados global, que pertence ao grupo de funções.

Exemplo de utilização do grupo de funções

Figura 6: Exemplo de utilização do grupo de funções

O programa principal não pode acessar diretamente a velocidade do objeto de dados do


grupo de funções.

© Direitos autorais. Todos os direitos reservados. 7


Capítulo 1 : Introdução à programação orientada a objetos

Instanciação múltipla

Figura 7: Várias instâncias de um grupo de funções

Para que o programa principal funcione com vários veículos, é necessário que haja
programação adicional e esforço administrativo. Um grupo de funções só pode fazer
referência a um veículo de cada vez.

Instanciação múltipla na programação orientada a objetos

Figura 8: Instanciação múltipla na programação orientada a objetos

A possibilidade de criar várias instâncias de tempo de execução utilizando o mesmo contexto


de programa é uma das características-chave da programação orientada a objetos.
Neste exemplo, você desenvolverá um programa para criar quatro veículos, todos com
características diferentes.
No entanto, todos os veículos compartilham a mesma estrutura de dados e o mesmo
conjunto de funções. Todos eles têm a capacidade de proteger seus dados de acesso
externo.

8 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação do modelo de programação orientado a objetos

Memória principal ABAP e encapsulamento

Figura 9: Memória principal ABAP e encapsulamento

As características do encapsulamento utilizando grupos de funções e subrotinas são as


seguintes:
● Você utiliza unidades de modularização para encapsular funções e dados.
● Você pode trabalhar com os dados globais do programa principal.

As funcionalidades de encapsulamento utilizando objetos são as seguintes:


● Você pode utilizar objetos para encapsular funções e dados.
● Você pode criar várias instâncias (objetos).
● Você pode executar várias instanciações.

Os objetos são armazenados no mesmo modo interno que o programa em uso. Todas as
áreas de dados são separadas umas das outras, o que as mantém protegidas.

© Direitos autorais. Todos os direitos reservados. 9


Capítulo 1 : Introdução à programação orientada a objetos

Gerenciamento de dados em modelos processuais e orientados a objetos

Figura 10: Gerenciamento de dados em modelos processuais e orientados a objetos

Ao contrário da programação procedural, o uso de instanciação múltipla na programação


orientada a objetos permite que você crie uma abstração direta de um objeto real. A
encapsulação foi sistematicamente estendida neste modelo de programação.

ABAP Objects
Os conceitos orientados a objetos do ABAP Objects compartilham conceitos com outras
linguagens modernas orientadas a objetos, como C++ ou Java. Os conceitos que não tiveram
êxito em outros idiomas não foram incluídos no ABAP Objects. Por outro lado, o ABAP
Objects tem elementos de linguagem úteis que C++ e Java não têm. Certos recursos do
ABAP Objects só existem devido à compatibilidade ascendente garantida dos elementos de
linguagem ABAP mais antigos. A diferença entre ABAP Objects e outras linguagens
orientadas a objetos é o ambiente de desenvolvimento. Você pode utilizar o conjunto
completo de funções do ABAP Workbench com o ABAP Objects.
Você pode utilizar instruções ABAP Objects em programas ABAP procedural.

10 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação do modelo de programação orientado a objetos

O ABAP Objects como ampliação compatível do ABAP

Figura 11: O ABAP Objects como ampliação compatível do ABAP

O ABAP Objects não é um novo idioma, mas foi projetado como uma extensão sistemática do
ABAP. Todas as extensões, incluindo as antigas partes processuais, são compatíveis com a
alta.
As verificações de tipo nos contextos orientados a objetos do ABAP Objects são mais
rigorosas do que as dos contextos procedurais.
Para desenvolver ABAP Objects, a SAP limpou a linguagem ABAP nos contextos orientados a
objetos. Isso significa que as instruções obsoletas originam erros de sintaxe.

Nota:
É aconselhável evitar declarações obsoletas no ambiente puramente processual,
pois cria um texto fonte mais seguro e flexível. No entanto, como a linguagem é
compatível para cima, não é possível impedir o uso completo de tais afirmações.

Para obter uma lista de elementos de linguagem obsoletos, consulte a Documentação de


palavras-chave ABAP. O ABAP proíbe a utilização de instruções obsoletas no contexto
orientado a objetos.

© Direitos autorais. Todos os direitos reservados. 11


Capítulo 1 : Introdução à programação orientada a objetos

Relação cliente/servidor entre objetos

Figura 12: Relações client/servidor entre objetos

Os objetos se comportam como sistemas cliente/servidor. Quando um objeto envia uma


mensagem para outro objeto para pedir que ele se comporte de uma determinada forma, o
primeiro objeto é definido como um cliente e o segundo objeto é definido como um servidor.
Para poder separar solicitações e entregas de serviços, as seguintes condições devem ser
atendidas:
● O objeto client deve respeitar o protocolo do objeto do servidor.
● O protocolo do objeto do servidor deve ser suficientemente claro para que um cliente
potencial o siga sem problemas.

Os objetos podem executar as duas funções simultaneamente. eles podem oferecer serviços
a outros objetos enquanto solicitam serviços ao mesmo tempo.
Na programação orientada a objetos, os serviços são distribuídos entre os objetos de modo
que não haja redundâncias e cada objeto oferece exatamente os serviços pelos quais é
responsável. Se um objeto necessitar de outros serviços, ele solicita os mesmos de outros
objetos. Esse conceito é conhecido como o princípio da delegação.

Relação cliente/servidor - Exemplo


O desenvolvedor deve implementar a tarefa comum de obtenção e saída de dados em dois
objetos. Um objeto é responsável pela obtenção de dados e outro objeto é responsável pela
saída. Enquanto o objeto de obtenção de dados não modificar o seu protocolo, o
desenvolvedor pode modificar a implementação interna do objeto de recuperação sem
modificar o outro objeto.
Em alternativa, um objeto diferente poderia até substituir o objeto de obtenção de dados
desde que o novo objeto utilize o mesmo protocolo. Essas trocas também podem ser
realizadas no momento da execução.

12 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação do modelo de programação orientado a objetos

Conceitos adicionais do modelo de programação orientado a objetos

Figura 13: Conceitos adicionais do modelo de programação orientado a objetos

Alguns conceitos adicionais no modelo de programação orientada a objetos são os seguintes:


● Herança
A herança define as relações de implementação entre classes, de modo que uma classe
(subclasse) adota, adapta ou amplia a estrutura e o comportamento de outra classe
(classe superior).
● Polimorfismo
Polimorfismo é quando instâncias de classes respondem de forma diferente às mesmas
mensagens.
● Controle de evento
Em vez de enviar mensagens diretamente para objetos específicos, os objetos também
podem acionar eventos. Em seguida, outros objetos reagem quando o evento é acionado.

ABAP orientado a objetos

Principais características do modelo de programação orientado a objetos do ABAP


Objects

● Os objetos são uma abstração direta do mundo real.


● Os objetos são unidades compostas por dados e funções.
● Os processos podem ser implementados de uma forma melhor do que na programação
procedimental.

© Direitos autorais. Todos os direitos reservados. 13


Capítulo 1 : Introdução à programação orientada a objetos

Vantagens do modelo de programação orientado a objetos em comparação com o


modelo de programação processual

● Consistência e estrutura de software melhorada no processo de desenvolvimento


● Esforço de atualização reduzido e menor probabilidade de erros
● Melhor integração do cliente ou usuário no processo de análise, design e manutenção
● Extensão mais simples e segura do software

É usada uma linguagem padronizada nas várias fases de desenvolvimento de software


(análise, especificação, design e implementação). Devido a essa padronização, a
comunicação é mais fácil quando você muda entre as fases.

O processo de desenvolvimento de software

Figura 14: O processo de desenvolvimento de software

Na programação orientada a objetos, as decisões de análise e design têm um efeito maior na


implementação do que na programação processual. Para tanto, utiliza-se a linguagem de
modelagem ou ferramentas para padronizar a fase de análise e projeto.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Descrever as diferenças entre os modelos de programação procedimental e orientado a
objetos

14 © Direitos autorais. Todos os direitos reservados.


Capítulo 1
Lição 2
Análise e design com Unified Modeling
Language (UML)

SÍNTESE DA LIÇÃO
Esta lição explica como desenvolver uma solução orientada a objetos para um problema de
aplicação empresarial. Ela também explica como classificar seus objetos e definir as relações
entre eles usando partes da Linguagem de Modelagem Unificada (UML) como um auxílio
visual.

Exemplo de negócio
Você precisa modelar um requisito de aplicação empresarial antes de implementar a
aplicação empresarial. Por esse motivo, você precisa:
● Compreensão dos diagramas de classe
● Compreender os diagramas de objetos
● Compreender os diagramas de sequência

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Classificar objetos
● Modelo em UML

© Direitos autorais. Todos os direitos reservados. 15


Capítulo 1 : Introdução à programação orientada a objetos

Classificação de objetos

Figura 15: Classificação de objetos

A programação orientada a objetos vê o mundo real como uma coleção de objetos, como
aviões, carros e pessoas. Alguns destes objetos são semelhantes. Em outras palavras, os
objetos podem ser descritos da mesma forma se usarem as mesmas características e
exibirem o mesmo comportamento.
Você pode agrupar todas as características e comportamentos desses objetos semelhantes
em uma classe central. Esta classe é usada para descrever cada objeto derivado dela.
Portanto, uma classe é uma descrição de uma quantidade de objetos que exibem as mesmas
características e o mesmo comportamento.
Por exemplo, o veículo (make x, ..., model n), é um objeto da classe car. Este objeto é uma
instância concreta de sua classe. Por isso, um objeto tem uma identidade, um status (número
de instâncias de característica) e um comportamento. Os conceitos de identidade e status
são diferentes um do outro.
A identidade é um atributo que distingue cada objeto de todos os outros objetos de sua
classe. Dois objetos podem ter valores de atributo idênticos, mas esses objetos podem não
ser idênticos. Por exemplo, duas xícaras de café têm a mesma altura, diâmetro, alça e cor.
Embora seus status sejam idênticos, são duas xícaras de café diferentes.
A literatura sobre o tema da programação orientada a objetos fala sobre instâncias. O termo
instância significa um objeto.

Nota:
O significado literal da instância é um pouco mais específico. Isso significa que a
instância de uma classe é identificável de forma única. Neste capítulo, você fará
uma distinção entre instância e objeto.

16 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

Classes como formas de abstração

Figura 16: Classes como formas de abstração

Em um contexto de software, abstrações são simplificações de relações complexas no


mundo real. Você pode abstrair um objeto real e existente para as dimensões necessárias
para simular uma determinada seção do mundo real. Na figura, Classes como formas de
abstração, veículos são usados para explicar o conceito de abstração. Software para um
entusiasta de veículos e software para um comerciante de sucata contém diferentes
abstrações (classes) para objetos. Portanto, dependendo do tipo de abstração, uma classe
pode conter diferentes aspectos de um objeto.

© Direitos autorais. Todos os direitos reservados. 17


Capítulo 1 : Introdução à programação orientada a objetos

Comparação de classes e objetos

Figura 17: Comparação de classes e objetos

Compreender a relação entre classes e objetos é um pré-requisito para concluir as lições


seguintes com êxito.

Modelagem em UML

UML é uma linguagem de modelagem globalmente padronizada. Você a utiliza para


especificação, construção, visualização e documentação de modelos de sistema de software.
A UML permite uma comunicação uniforme entre usuários. UML é um padrão da indústria e
foi desenvolvido pelo Object Management Group (OMG) em setembro de 1997. A SAP utiliza
o UML como padrão para toda a empresa para modelagem orientada a objetos. Para mais
informações sobre as especificações UML, consulte http://www.omg.org na página inicial
OMG.

Diagramas de classe
Os diferentes tipos de diagrama em UML representam diferentes visões de um sistema.

Três tipos de diagrama que representam diferentes visões de um sistema

● Diagramas de classe
Os diagramas de classe exibem as relações entre as classes. Esta é uma visão estática de
um modelo.
● Diagramas de comportamento
Os diagramas de comportamento mostram a sequência em que os objetos se relacionam.
● Diagramas de componente

18 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

Os diagramas de componentes mostram a organização e as dependências dos


componentes.

Você pode utilizar ABAP Objects para implementar diagramas de classe e diagramas de
comportamento de uma perspectiva de programação.
Os diagramas de componentes podem ser realizados utilizando o pacote de objetos do
repositório.

Representação UML de uma classe

Figura 18: Representação de uma classe

Uma classe é representada por um retângulo na notação UML.


Uma classe pode ser representada da seguinte forma:
● Nome da classe
● Atributos da classe (opcional)
● Métodos da classe (opcional)

Os atributos descrevem os dados que podem ser armazenados nos objetos de uma classe.
Eles também determinam o status de um objeto. Os métodos descrevem as funções que um
objeto pode executar. Eles determinam como um objeto se comporta.

© Direitos autorais. Todos os direitos reservados. 19


Capítulo 1 : Introdução à programação orientada a objetos

Exemplo de um diagrama de classe

Figura 19: Um exemplo de diagrama de classe

Um diagrama de classe descreve todas as relações estáticas entre as classes.


As formas básicas de relações estáticas são as seguintes:

Associação
um cliente reserva um veículo em uma empresa locadora de veículos.
Generalização e especialização
Um carro, um ônibus e um caminhão são todos veículos.

Nota:
As classes também podem ser exibidas em diagramas de classe com seus
atributos e métodos. Neste exemplo de um diagrama de classes, esses atributos e
métodos foram omitidos para melhorar a clareza.

20 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

Associação

Figura 20: Associação

Uma associação descreve uma relação semântica entre classes. A relação específica entre os
objetos nessas classes é conhecida como ligação de objetos. Por isso, as ligações de objetos
indicam associações.
No entanto, uma associação também pode ser recursiva. Nesse caso, a classe teria uma
relação consigo mesma.
Na maioria dos casos, as associações recursivas são utilizadas para ligar dois objetos
diferentes na mesma classe.
Cada associação tem duas funções, uma para cada direção da associação. Cada função pode
ser descrita por um nome de associação. Cada função tem uma cardinalidade que mostra
quantas instâncias podem participar nessa relação. A multiplicidade é o número de objetos
participantes em uma classe que têm uma relação com um objeto na outra classe. Como
todos os outros elementos do modelo, as cardinalidades são dependentes da situação
concreta que está sendo modelada.
Neste exemplo, você também pode exigir uma cardinalidade de pelo menos um para indicar
que somente alguém que realmente faz uma reserva se torna um cliente da locadora de
veículos. Por outro lado, a cardinalidade de qualquer número permitiria uma definição mais
geral de um cliente.
As características da associação são as seguintes:
● Representa uma associação entre símbolos de classe desenhando uma linha entre eles.
● Indique a cardinalidade (também referida como multiplicidade) da relação no fim de cada
linha.
● Você deve usar as setas para indicar as opções de navegação.

© Direitos autorais. Todos os direitos reservados. 21


Capítulo 1 : Introdução à programação orientada a objetos

● Você deve escrever o nome da associação em itálico acima da linha. O nome pode conter
uma seta para indicar a direção da leitura.
● Insira os nomes das funções no final das linhas se o modelador definir funções para os dois
parceiros.

Associação com funções - Exemplo

Figura 21: Exemplos de associação a funções

Você pode utilizar nomes de função no fim das linhas de associação para descrever as
relações entre as classes envolvidas. Na figura, Exemplos de associação com funções, uma
pessoa pode aparecer na função de um empregado ou na função de um diretor da empresa.
Na associação recursiva mostrada na figura, Exemplos de associação com funções, as
funções de filho e pai são definidas usando nomes de função. Duas instâncias da classe
LCL_PERSON têm uma relação entre si e representam duas funções.

22 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

Classes de associação

Figura 22: Classes de associação

Se a associação for utilizada para ligar duas classes, uma classe especial pode representar
essa relação.
As características da relação são descritas utilizando os atributos da classe de associação.
Uma linha pontilhada conecta esta classe à linha de associação.

Agregação e composição

Figura 23: Agregação e composição

A agregação e a composição são especializações da associação. A agregação e a composição


mostram que um objeto pode conter outros objetos. A relação pode ser descrita usando as
frases “consiste em” ou “faz parte de”. Por exemplo, um carro consiste em rodas e um motor,
entre outras coisas.

© Direitos autorais. Todos os direitos reservados. 23


Capítulo 1 : Introdução à programação orientada a objetos

A agregação e a composição aparecem como uma linha entre duas classes. Eles são
rotulados usando um pequeno rombo. O rombo indica a agregação ou composição. Caso
contrário, as convenções de notação são as mesmas utilizadas para associações.
A composição é uma especialização da agregação. Composição significa que o objeto contido
não pode existir sem a agregação (por exemplo, uma reserva de veículo não pode existir sem
a agência de locação de veículos). Por isso, a cardinalidade deste tipo de agregado é pelo
menos um. O tempo de duração das partes individuais está ligado ao tempo de duração do
agregado. Isso significa que as partes são criadas ao mesmo tempo que o agregado ou após o
agregado e são destruídas ao mesmo tempo que o agregado ou antes do agregado. Na
notação UML, um rombo preenchido denota composição.

Generalização e especialização

Figura 24: Generalização e especialização

As relações de generalização e especialização são sempre bidirecionais. Por exemplo, a


classe lcl_truck pode ser generalizada como uma classe especial de lcl_vehicle. As relações
de generalização e especialização são denotadas por uma seta triangular. Essa seta sempre
aponta da classe especializada para a classe generalizada. O nível de generalização aumenta
na direção da seta. As árvores podem ser criadas utilizando essas relações.

24 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

diagramas de objeto

Figura 25: Diagrama de objetos

Um diagrama de objeto é um instantâneo tirado durante a execução do programa. Ele


descreve instâncias de classes e as relações entre elas. Não é um novo tipo de diagrama, mas
sim uma variante do diagrama de classe. Ele só é útil para representar um diagrama de
classes complexo.

Diagramas de sequência

Figura 26: Um diagrama de sequência

Os diagramas de sequência são utilizados para exibir determinados processos ou situações.

© Direitos autorais. Todos os direitos reservados. 25


Capítulo 1 : Introdução à programação orientada a objetos

Um diagrama de sequência descreve a sequência em que os objetos são processados e a


interação que eles têm entre si.
Os diagramas de sequência podem exibir os seguintes processos:
● Quando os objetos são criados ou excluídos
● Quando os objetos trocam mensagens

Na notação UML, a linha de vida do objeto é representada por linhas verticais pontilhadas
com uma caixa contendo o nome do objeto no topo. Um X é utilizado para indicar o fim da
linha da vida. O foco do controle aparece como um retângulo vertical na linha de vida do
objeto. O foco do controle mostra o período ativo do objeto.
Os status possíveis de um objeto são os seguintes:
● Um objeto está ativo quando ações são executadas.
● Um objeto está indiretamente ativo se estiver esperando o encerramento de um
procedimento subordinado.

As mensagens aparecem como setas horizontais entre as linhas do objeto. A mensagem é


escrita por cima da seta no formulário Mensagem (parâmetro). Existem várias formas de
representar a resposta. Neste exemplo, ela aparece como uma seta de retorno pontilhada.
Você também pode incluir uma descrição do processo e adicionar comentários à linha da vida
do objeto.

O princípio de delegação

Figura 27: Princípio de delegação no diagrama de sequência

Na delegação, dois objetos estão envolvidos no processamento de uma solicitação. O


destinatário da solicitação atribui a execução da solicitação a um delegado. Neste exemplo, o
motorista (motorista do objeto) envia a mensagem get_fuel_level ( ) para o veículo (objeto
carro). Quando a mensagem é recebida, o carro envia uma mensagem para o tanque (tanque
objeto) para descobrir o que o tanque contém. Em outras palavras, o carro delega a tarefa ao
tanque. Se necessário, o carro formata as informações contendo o valor atual do conteúdo do
tanque antes de devolvê-lo ao motorista.

26 © Direitos autorais. Todos os direitos reservados.


Lição: Análise e design com Unified Modeling Language (UML)

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Classificar objetos
● Modelo em UML

© Direitos autorais. Todos os direitos reservados. 27


Capítulo 1 : Introdução à programação orientada a objetos

28 © Direitos autorais. Todos os direitos reservados.


Capítulo 1

Avaliação da aprendizagem

1. Dados e funções são mantidos separados no modelo de programação procedimental.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. O que significa instanciação múltipla?


Escolha a resposta correta.

X A Criação e gerenciamento de instâncias de tempo de execução

X B Implementar relações entre classes

X C Criação de instâncias de diferentes classes

X D Envio de mensagens diretamente para objetos específicos por meio do


acionamento de eventos

3. Qual das seguintes opções é uma simplificação das relações complexas no mundo real?
Escolha a resposta correta.

X A Herança

X B Abstração

X C Encapsulamento

X D Controle de evento

4. Qual tipo de diagrama UML presta especial atenção à sequência em que os objetos se
relacionam?
Escolha a resposta correta.

X A Classe

X B Comportamento

X C Componente

X D Objeto

© Direitos autorais. Todos os direitos reservados. 29


Capítulo 1 : Avaliação da aprendizagem

5. Você pode agrupar todas as características e comportamentos de objetos semelhantes


em uma classe central.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

30 © Direitos autorais. Todos os direitos reservados.


Capítulo 1

Avaliação da aprendizagem - Respostas

1. Dados e funções são mantidos separados no modelo de programação procedimental.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O modelo de programação procedimental permite a separação de


dados e funções. Em um programa de procedimento ABAP, as variáveis globais contêm
dados, enquanto os subprogramas contêm funções. Leia mais na tarefa, O modelo de
programação processual, na lição, Introdução à programação orientada a objetos, no
curso BC401.

2. O que significa instanciação múltipla?


Escolha a resposta correta.

X A Criação e gerenciamento de instâncias de tempo de execução

X B Implementar relações entre classes

X C Criação de instâncias de diferentes classes

X D Envio de mensagens diretamente para objetos específicos por meio do


acionamento de eventos

Você está correto! Instanciação múltipla é a possibilidade de criar várias instâncias de


tempo de execução utilizando o mesmo contexto de programa. É uma das principais
características da programação orientada a objetos. Saiba mais na tarefa, Instanciação
múltipla na programação orientada a objetos, na lição Introdução à programação
orientada a objetos, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 31


Capítulo 1 : Avaliação da aprendizagem - Respostas

3. Qual das seguintes opções é uma simplificação das relações complexas no mundo real?
Escolha a resposta correta.

X A Herança

X B Abstração

X C Encapsulamento

X D Controle de evento

Você está correto! Ao contrário da programação procedural, o uso de instanciação


múltipla na programação orientada a objetos permite que você crie uma abstração direta
de um objeto real. Os objetos são uma abstração direta do mundo real. Saiba mais na
tarefa ABAP orientado a objetos, na lição Introdução à programação orientada a objetos,
no curso BC401.

4. Qual tipo de diagrama UML presta especial atenção à sequência em que os objetos se
relacionam?
Escolha a resposta correta.

X A Classe

X B Comportamento

X C Componente

X D Objeto

Você está correto! Os diferentes tipos de diagrama em UML representam diferentes


visões de um sistema. Os diagramas de comportamento mostram a sequência em que os
objetos se relacionam. Leia mais na tarefa Diagramas de classe, na lição Análise e design
com Unified Modeling Language (UML), no curso BC401.

5. Você pode agrupar todas as características e comportamentos de objetos semelhantes


em uma classe central.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! A programação orientada a objetos vê o mundo real como uma coleção
de objetos. Alguns desses objetos são semelhantes e podem ser descritos da mesma
forma se usarem as mesmas características e apresentarem o mesmo comportamento.
Você pode agrupar todas as características e comportamentos desses objetos
semelhantes em uma classe central. Leia mais na tarefa Classificação de objetos, na lição
Análise e design com Unified Modeling Language (UML), no curso, BC401.

32 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 2 Sintaxe básica orientada a
objetos

Lição 1
Criação de classes locais 35

Lição 2
Criar objetos 49

Lição 3
Acessar métodos e atributos 55

Lição 4
Implementação de construtores em classes locais 61

Lição 5
Implementação de construtores de classe em classes locais 65

OBJETIVOS DO CAPÍTULO

● Definir classes locais


● Definir atributos
● Criar métodos
● Criar objetos
● Chamar métodos de instância
● Chamar métodos estáticos
● Chamar métodos funcionais
● Acessar atributos públicos
● Criar e utilizar construtores
● Criar e utilizar construtores estáticos

© Direitos autorais. Todos os direitos reservados. 33


Capítulo 2 : Sintaxe básica orientada a objetos

34 © Direitos autorais. Todos os direitos reservados.


Capítulo 2
Lição 1
Criação de classes locais

SÍNTESE DA LIÇÃO
Esta lição fornece uma síntese de classes, atributos e métodos locais, que são os elementos
de sintaxe fundamentais orientados a objetos.

Exemplo de negócio
Como desenvolvedor, você precisa implementar classes, objetos e associações do seu
modelo no ABAP Objects.

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir classes locais
● Definir atributos
● Criar métodos

Definição de classes locais

Figura 28: Um exemplo de uma classe

O conceito de classes é a base da programação orientada a objetos. Uma classe pode ter
componentes públicos ou privados. Você pode acessar componentes públicos, como

© Direitos autorais. Todos os direitos reservados. 35


Capítulo 2 : Sintaxe básica orientada a objetos

métodos e eventos, de fora de uma classe. No entanto, você não pode acessar componentes
privados, por exemplo, tipos de dados e atributos, de fora de uma classe.
A figura, Um exemplo de classe, mostra um veículo como um exemplo de uma classe.

Características de uma classe

Figura 29: Definição de classes

As características de uma classe na programação orientada a objetos são as seguintes:


● Uma classe é um conjunto de objetos que têm a mesma estrutura e exibem o mesmo
comportamento.
● Uma classe fornece um blueprint para todos os objetos com base nesta classe.
● Uma classe é composta por componentes, como atributos, métodos, eventos, constantes,
tipos e interfaces implementadas, definidos na parte da definição. Você só pode
implementar métodos na parte de implementação.
● Uma instrução de classe não pode ser aninhada; ou seja, você não pode definir uma classe
em uma classe. Contudo, você pode definir classes auxiliares locais para classes globais.

36 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Declaração de atributos

Figura 30: Um exemplo de atributos

Os atributos contêm os dados que podem ser armazenados nos objetos de uma classe.
Os tipos de atributos são os seguintes:
● Objeto de dados elementares
● Estruturado
● Tipo de tabela

Os atributos podem ser compostos por tipos de dados (locais ou globais) ou tipos de
referência.

Tabela 1: Atributos
A tabela seguinte exibe alguns exemplos de atributos para a classe LCL_VEHICLE:
Atributos Descrição
MAKE Marca do veículo
MODEL Tipo de modelo
SER_NO Número de série
COLOR Cor
MAX_SEATS Número de lugares
R_MOTOR Referência à classe LCL_MOTOR

© Direitos autorais. Todos os direitos reservados. 37


Capítulo 2 : Sintaxe básica orientada a objetos

Definição de atributos, tipos e constantes

Figura 31: Definição de atributos, tipos e constantes

Na classe Instruções DATA, você só pode utilizar o suplemento TYPE para referenciar tipos
de dados.
O suplemento LIKE só é permitido para objetos de dados locais ou campos SY (por exemplo,
SY-DATE, SY-UNAME, etc.).
O suplemento READ-ONLY indica que um atributo público declarado com DATA pode ser lido
de fora. No entanto, o atributo só pode ser modificado por métodos da mesma classe.
Atualmente, você pode utilizar o suplemento READ-ONLY na área de visibilidade pública
(PUBLIC SECTION) de uma declaração de classe ou em uma definição de interface.
Com TYPE REF TO, você pode digitar um atributo como referência.
A instrução CONSTANTS é utilizada na definição de classe para definir objetos de dados que
têm um valor constante.
Se você utilizar a instrução TYPES na definição de classe, você está declarando um tipo local
específico para essa classe local. Você pode criar um tipo local a ser utilizado por um ou mais
atributos na mesma classe.

38 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Visibilidade de atributos

Figura 32: Áreas de visibilidade de atributos

Os atributos privados não podem ser endereçados diretamente de fora da classe e não são
visíveis para usuários externos. Você pode proteger atributos de acesso externo,
caracterizando-os como atributos privados.

Nota:
O conceito amizade é uma exceção a esta regra.

Os atributos públicos são atributos visíveis para todos os usuários e que podem ser
acessados diretamente por usuários externos.
Da mesma forma, as constantes e os tipos definidos por uma classe podem ser privados
(para uso dentro da classe) ou públicos (acessíveis de fora da classe). Os componentes
públicos de uma classe são conhecidos coletivamente como a interface de classes.
A utilização da área de visibilidade privada é conhecida como ocultação ou encapsulamento
de informações. O encapsulamento protege um usuário de classe fazendo alterações em
componentes privados invisíveis ao usuário externo.
Você pode modificar os componentes privados de uma classe sem modificar a interface.
Suponha que os componentes privados de uma classe são alterados em algum momento
com sua interface permanecendo a mesma, os usuários externos ainda podem continuar a
trabalhar com a classe como antes. Os usuários externos só podem acessar os componentes
por meio da interface da classe e não perceberão as alterações da implementação interna nas
SEÇÕES PRIVADAS. No entanto, quando os componentes públicos de uma classe são
modificados, cada usuário externo deve considerar essas modificações. Portanto, utilize
atributos públicos com moderação, ou evite fazer alterações incompatíveis em componentes
públicos.

© Direitos autorais. Todos os direitos reservados. 39


Capítulo 2 : Sintaxe básica orientada a objetos

Acesso a atributos privados

Figura 33: Definição de atributos

Os atributos privados são definidos na PRIVATE SECTION de uma classe. Os atributos


públicos são definidos na PUBLIC SECTION de uma classe.
Você pode acessar atributos privados utilizando métodos públicos que retornam ou
modificam os valores dos atributos privados.
O requisito de tempo de execução ligeiramente superior (chamadas de método em
comparação com a avaliação direta) é considerado para satisfazer o conceito de
encapsulamento.
A assinatura de um método público estabelece claramente que valores devem ou podem ser
transferidos e que tipos devem ser atribuídos a esses valores. A assinatura de um método
público força o usuário externo a utilizar os tipos corretos. Este método também garante que
todos os atributos privados sejam tratados de forma consistente.
Por exemplo, na figura Definição de atributos, se os atributos MAKE e MODEL forem públicos,
será arriscado porque o usuário poderá esquecer de fornecer os atributos ou especificar
atributos inconsistentes.
Para resolver esta situação, você pode utilizar um método público, SET_TYPE, para garantir
que são indicados valores adequados para os dois atributos. Uma verificação rigorosa de
sintaxe controla as chamadas de método, garantindo a transferência de todos os parâmetros
necessários. Um método pode executar uma verificação de consistência (para ver se uma
determinada marca de veículo produz o modelo selecionado) e emitir uma exceção se ocorrer
um erro.
Para minimizar o tempo de execução, é possível definir atributos individuais na área de
visibilidade pública. Depois de você ter definido os atributos, dê a eles o suplemento READ-
ONLY.

40 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Atributos estáticos e atributos de instância

Figura 34: Comparação de atributos de instância e atributos estáticos

Os diferentes tipos de atributos são os seguintes:


● Atributos de instância
Os atributos de instância existem uma vez por objeto, ou seja, uma vez por instância de
tempo de execução da classe. Você define atributos de instância com o elemento de
sintaxe DATA.
● Atributos estáticos
Os atributos estáticos existem uma vez para cada classe e são visíveis para todas as
instâncias de tempo de execução nessa classe. Você define atributos estáticos com o
elemento de sintaxe CLASS-DATA.
Os atributos estáticos geralmente contêm as seguintes informações que se aplicam a
todas as instâncias:
- Tipos e constantes
- Buffers de dados de aplicação centrais
- Informações administrativas, como o contador de instâncias

A literatura técnica se refere a atributos estáticos como “atributos de classe” (usamos o


elemento de sintaxe CLASS-DATA). Como em C++ e Java, o ABAP Objects utiliza o termo
oficial “atributo estático”.

© Direitos autorais. Todos os direitos reservados. 41


Capítulo 2 : Sintaxe básica orientada a objetos

Atributos de instância e atributos estáticos no contexto do programa

Figura 35: Atributos de instância e atributos estáticos no contexto do programa

A figura mostra como o atributo estático GV_N_O_VEHICLES está relacionado a outros


elementos de programa na memória. O atributo estático só existe uma vez na classe
carregada, independentemente do número de instâncias de LCL_VEHICLE. Por isso, você
pode dizer que as instâncias compartilham atributos estáticos.

Cuidado:
Um objeto de dados de número inteiro é definido para contar instâncias. Não é
possível saber o número de instâncias criadas a partir do sistema.

42 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Implementação de métodos

Figura 36: Sintaxe para métodos

Algumas das características-chave de métodos são as seguintes:


● Os métodos são procedimentos internos nas classes que determinam o comportamento
dos objetos. Eles podem acessar todos os atributos em sua classe e, portanto, podem
modificar o estado dos atributos.
● Os métodos possuem uma assinatura (parâmetros de interface e exceções) que lhes
permite receber valores quando são chamados e transferir valores de volta para o
programa de chamada.
● Os métodos podem ter um número qualquer de parâmetros IMPORTING, EXPORTING e
CHANGING. Todos os parâmetros podem ser transferidos por valor ou referência.

Assinatura de método

Os métodos funcionais têm um parâmetro RETURNING, bem como parâmetros de


importação e exceções.
Você pode definir todos os parâmetros de entrada (parâmetros IMPORTING e CHANGING)
como parâmetros opcionais na declaração, utilizando o suplemento OPTIONAL ou DEFAULT.
Você não precisa transferir esses parâmetros quando chama o objeto. Utilizando o
suplemento OPTIONAL, o parâmetro é inicializado de acordo com o tipo, enquanto o
suplemento DEFAULT permite que você insira um valor inicial.
Os métodos também suportam o valor de retorno SY-SUBRC, mas somente quando você
define as exceções de assinatura com a utilização de EXCEPTIONS. Utilize o suplemento

© Direitos autorais. Todos os direitos reservados. 43


Capítulo 2 : Sintaxe básica orientada a objetos

RAISING em vez de EXCEPTIONS para propagar exceções baseadas na classe. O chamador


trata depois essas exceções baseadas na classe sem avaliar o valor de retorno SY-SUBRC.

Nota:
Não utilize os dois conceitos juntos em um programa.

Visibilidade de métodos

Figura 37: Áreas de visibilidade de métodos

Você atribui métodos a uma área de visibilidade para determinar se os métodos são
chamados de fora da classe ou a partir da classe. Métodos privados permitem modularização
interna.

44 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Acesso a métodos privados

Figura 38: Acesso a métodos privados

Você define métodos privados em PRIVATE SECTION e métodos públicos em PUBLIC


SECTION de uma classe.
Não é possível acessar métodos privados diretamente de fora. Contudo, um método privado
pode ser chamado por um método público. Na figura, Acesso a métodos privados, INIT_TYPE
é um método privado chamado pelo método público SET_TYPE. A definição deste método
auxiliar privado é útil porque a instrução para inicializar atributos pode ser usada em outros
métodos.

Nota:
Este é um exemplo introdutório. Mais tarde, você aprenderá mais técnicas de
programação para avaliar parâmetros formais.

Em uma classe, declarações de nomes de atributo, nomes de método, nomes de evento,


nomes de constante, nomes de tipo e nomes de alias compartilham o mesmo espaço de
nomes. Além disso, existe um espaço de nomes local dentro dos métodos. Declarações locais
em um método substituem declarações feitas na classe.

© Direitos autorais. Todos os direitos reservados. 45


Capítulo 2 : Sintaxe básica orientada a objetos

Métodos estáticos e métodos de instância

Figura 39: Comparação de métodos de instância com métodos estáticos

Diferentes tipos de métodos são os seguintes:


● Métodos de instância
Você define métodos de instância utilizando a palavra-chave de sintaxe METHODS.
● Métodos estáticos
Você define métodos estáticos utilizando a palavra-chave de sintaxe CLASS-METHODS.
Você define métodos estáticos no nível da classe. Na sua implementação, você só pode
acessar componentes estáticos. Isso significa que os métodos estáticos não precisam de
instâncias e podem ser acessados diretamente por meio da classe.

No exemplo exibido na figura Comparação de métodos de instância com métodos estáticos,


o método estático GET_N_O_VEHICLES só pode acessar o atributo GV_N_O_VEHICLES. O
método set_type é um método de instância e pode acessar todos os atributos, tanto estáticos
como de instância.
Você pode ver métodos estáticos referidos como métodos de classe, de acordo com a
palavra-chave CLASS-METHODS. Em ABAP Objects, o termo oficial é “método estático”, tal
como está em C++ e Java.

46 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes locais

Representação da visibilidade em diagramas de classe UML

Figura 40: Áreas de visibilidade e notação UML

Um diagrama de classe UML lista o nome da classe, os atributos de classe e os métodos.


Os componentes em uma classe são exibidos em um diagrama UML utilizando as seguintes
notações:
● Sinal de mais (+)
Um sinal de mais (+) indica componentes públicos (visíveis para todos os usuários).
● Sinal de menos (–)
Um sinal de menos (–) indica componentes privados (invisíveis para usuários externos).
● Sublinhado
Um sinal de nome de componente sublinhado (_) indica componentes estáticos.

Alternativamente, as palavras-chave públicas e privadas podem ser utilizadas como prefixo


para métodos.
Uma UML também permite que os fabricantes de ferramentas de modelagem criem seus
próprios símbolos para aumentar a visibilidade. A utilização de características de visibilidade
é opcional e é normalmente utilizada somente em modelos que estão se aproximando da
implementação.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir classes locais
● Definir atributos

© Direitos autorais. Todos os direitos reservados. 47


Capítulo 2 : Sintaxe básica orientada a objetos

● Criar métodos

48 © Direitos autorais. Todos os direitos reservados.


Capítulo 2
Lição 2
Criar objetos

SÍNTESE DA LIÇÃO
Isso explica menos em o conceito de criação de objetos.

Exemplo de negócio
Como desenvolvedor, você quer criar várias instâncias para a classe local que criou em seu
projeto ABAP Objects. Por esse motivo, você precisa compreender como criar objetos.

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar objetos

Objetos como instâncias de classes

Figura 41: Visão geral de instâncias de classes

Uma classe contém a descrição genérica de um objeto e descreve as características que


todos os objetos nessa classe têm em comum. Durante o tempo de execução do programa,
você utiliza a classe para criar objetos discretos (instâncias) na memória. Esse processo é
denominado instanciação. Quando a classe é acessada pela primeira vez, ela é carregada
para a memória.

© Direitos autorais. Todos os direitos reservados. 49


Capítulo 2 : Sintaxe básica orientada a objetos

Dica:
Embora você possa utilizar classes e componentes estáticos para escrever
aplicações completas, o motivo para utilizar a programação orientada a objetos
é criar e trabalhar com instâncias de tempo de execução de classes.

Definição de variáveis de referência

Figura 42: Definição de variáveis de referência

A instrução DATA go_vehicle le1 TYPE REF TO lcl_vehicle define uma variável de referência.
Esta variável pode apontar para instâncias da classe lcl_vehicle. O valor inicial de uma variável
de referência é uma referência vazia, ou seja, a referência não aponta para nada.

50 © Direitos autorais. Todos os direitos reservados.


Lição: Criar objetos

Criar objetos

Figura 43: Criar objetos

A instrução CREATE OBJECT cria um objeto na memória. Os valores do atributo do objeto


são iniciais ou atribuídos de acordo com a especificação TYPE.

Semântica de referência de referências a objetos

Figura 44: Semântica de referência de referências a objetos

Variáveis de referência a objetos podem ser atribuídas umas às outras.


A figura Semântica de referência de referências de objeto ilustra um exemplo no qual, após a
instrução COMPUTE, GO_VEHICLE1 e GO_VEHICLE2 apontam para o mesmo objeto.

© Direitos autorais. Todos os direitos reservados. 51


Capítulo 2 : Sintaxe básica orientada a objetos

O coletor de lixo

Figura 45: O coletor de lixo

Referências independentes são referências que não foram definidas dentro de uma classe. O
coletor de lixo é uma rotina que é iniciada automaticamente sempre que o sistema de tempo
de execução não tiver tarefas mais importantes para executar.
Neste exemplo, a referência ao objeto (2) LCL_OBJECT é inicializada. No entanto, não existe
nenhum ponto de referência subsequente para este objeto. Por isso, o coletor de lixo elimina
o objeto não referenciado. Como não há um ponto de referência para o objeto (4)
LCL_OBJECT, ele também é excluído.
Você pode usar a consulta lógica IF go_obj IS INITIAL para determinar se go_obj contém a
referência nula ou não aponta para nenhum objeto.

Cuidado:
Você pode ter referências a objetos e referências de dados. No caso de
referências de dados, não utilize IS BOUND. No caso de referências a objetos,
você pode trabalhar com IS INITIAL e IS BOUND.

52 © Direitos autorais. Todos os direitos reservados.


Lição: Criar objetos

Várias instâncias

Figura 46: Administração de referência com instanciação múltipla

Para manter vários objetos da mesma classe em seu programa, você pode definir uma tabela
interna com uma coluna que contenha as referências a objetos para essa classe. Para
atualizar os objetos na tabela, você pode utilizar instruções para tabelas internas, como
APPEND, READ ou LOOP.

Exemplo de agregação

Figura 47: Exemplo de agregação

© Direitos autorais. Todos os direitos reservados. 53


Capítulo 2 : Sintaxe básica orientada a objetos

Os objetos na classe LCL_WHEEL têm sua própria identidade. Você pode criar objetos
independentemente da existência de um objeto na classe LCL_VEHICLE. As referências são
transferidas para objetos da classe LCL_VEHICLE, de modo a criar a associação desejada.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar objetos

54 © Direitos autorais. Todos os direitos reservados.


Capítulo 2
Lição 3
Acessar métodos e atributos

SÍNTESE DA LIÇÃO
Esta lição explica o processo de acesso a métodos e atributos.

Exemplo de negócio
Como desenvolvedor, você precisa explicar as várias formas de acessar métodos e atributos
de uma classe. Por esse motivo, você precisa:
● Compreensão de métodos de chamada
● Compreensão do acesso a atributos

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Chamar métodos de instância
● Chamar métodos estáticos
● Chamar métodos funcionais
● Acessar atributos públicos

Chamadas de método de instância

Figura 48: Chamar métodos

© Direitos autorais. Todos os direitos reservados. 55


Capítulo 2 : Sintaxe básica orientada a objetos

Esta seção explica o uso de classes e suas instâncias, desde as conexões estáticas de várias
instâncias até seus efeitos práticos.
O exemplo na figura, Chamando métodos, mostra a sintaxe mais curta para chamadas de
método nas quais o prefixo CALL-METHOD é omitido.

Sintaxe para chamar métodos de instância

Figura 49: Chamada de métodos de instância – Sintaxe

CALL METHOD ref->metod_name é a sintaxe utilizada para chamar métodos de instância. Ao


chamar um método de instância a partir de outro método de instância, você pode omitir a
referência de nome de instância. O método é executado automaticamente para o objeto
atual.
Uma sintaxe mais curta também é suportada a partir do SAP NetWeaver Application Server
(SAP NetWeaver AS) 6.10. Nesta versão, omita CALL METHOD e lista os parâmetros entre
parênteses. Não deve existir espaço antes dos parênteses, mas deve existir pelo menos um
espaço após os parênteses. Quando você chama um método que só tem um parâmetro de
importação, você pode indicar o parâmetro real entre parênteses, sem outros suplementos.
Quando você chama um método que só tem parâmetros de importação, você pode omitir o
suplemento EXPORTING.

56 © Direitos autorais. Todos os direitos reservados.


Lição: Acessar métodos e atributos

Chamadas de método estático

Figura 50: Chamada de métodos estáticos – Sintaxe

Utilize CALL METHOD classname=>metod_name para chamar métodos estáticos (também


referidos como métodos de classe).
À semelhança dos atributos estáticos, os métodos estáticos são endereçados com o nome de
sua classe, uma vez que não precisam de instâncias.
Tal como com os métodos de instância, quando você chama um método estático da classe,
você pode omitir o nome da classe; caso contrário, são aplicadas aqui as mesmas regras que
para chamar um método de instância.

© Direitos autorais. Todos os direitos reservados. 57


Capítulo 2 : Sintaxe básica orientada a objetos

Chamadas de método funcional

Figura 51: Métodos funcionais

Os métodos que têm o parâmetro RETURNING são descritos como métodos funcionais. O
parâmetro RETURNING deve ser sempre passado por valor - RETURNING VALUE(...) - e não
por referência.

Nota:
Antes do SAP NetWeaver 7.40, os métodos funcionais só permitiam parâmetros
IMPORTING e exceções, além de seus parâmetros RETURNING. A partir do SAP
NetWeaver 7.40, eles podem ter qualquer número de parâmetros EXPORTING e
CHANGING.

Você pode chamar diretamente métodos funcionais nas seguintes expressões:


● Expressões lógicas: IF, ELSEIF, WHILE, CHECK, WAIT
● Expressões aritméticas e expressões de bits: COMPUTE
● Condições do caso: CASE, WHEN

Nota:
No SAP NetWeaver 7.02, a lista de posições nas quais os métodos funcionais
podem ser utilizados foi ampliada consideravelmente.

58 © Direitos autorais. Todos os direitos reservados.


Lição: Acessar métodos e atributos

Métodos funcionais –Exemplos

Figura 52: Métodos funcionais –Exemplos

Na primeira parte do exemplo, as duas chamadas de método de instância funcional


representam os dois adendos de um suplemento.
O segundo exemplo mostra a chamada de um método estático funcional em forma breve. O
objeto de dados GV_NUMBER é o parâmetro real para o parâmetro RETURNING do método.
A sintaxe detalhada é a seguinte:
DATA gv_number TYPE i.
...
CALL METHOD lcl_vehicle=>get_n_o_vehicles
RECEIVING rv_count = gv_number.

© Direitos autorais. Todos os direitos reservados. 59


Capítulo 2 : Sintaxe básica orientada a objetos

Acesso a atributos públicos

Figura 53: Acesso a atributos públicos

Você pode acessar atributos públicos de fora da classe da mesma forma que chamadas de
método. Você pode acessar atributos estáticos utilizando
CLASSNAME=>STATIC_ATTRIBUTE. Acessar atributos de instância com REF-
>INSTANCE_ATTRIBUTE.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Chamar métodos de instância
● Chamar métodos estáticos
● Chamar métodos funcionais
● Acessar atributos públicos

60 © Direitos autorais. Todos os direitos reservados.


Capítulo 2
Lição 4
Implementação de construtores em classes
locais

SÍNTESE DA LIÇÃO
Esta lição explica a implementação de métodos de construtor em classes locais.

Exemplo de negócio
Como desenvolvedor, você deve explicar a criação e utilização de construtores de instância
para a classe em seu projeto ABAP Objects. Por esse motivo, você precisa:
● Compreensão de construtores de instância
● Compreensão de como utilizar construtores de instância

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar e utilizar construtores

Construtor de instância

Figura 54: Construtor de instância

© Direitos autorais. Todos os direitos reservados. 61


Capítulo 2 : Sintaxe básica orientada a objetos

Existem dois tipos de métodos no ABAP Objects. Os ABAP Objects podem ser chamados
implícita ou explicitamente com a sintaxe CALL METHOD. Os construtores são o primeiro tipo
de método.
O construtor de instância é um método de instância especial em uma classe e é sempre
chamado CONSTRUCTOR. O construtor é automaticamente chamado com a instrução
CREATE OBJECT, no momento da execução.
Ao definir construtores, considere sempre os seguintes pontos:
● Nenhuma classe pode ter mais de um construtor de instância.
● Um construtor deve ser definido na área pública.
● A assinatura do construtor só pode incluir parâmetros de importação e exceções.
● Quando são acionadas exceções no construtor, não são criadas instâncias e não é
ocupado nenhum espaço de memória principal.
● Com exceção de um caso único, você não pode chamar o construtor explicitamente.

Nota:
Não existe nenhum destrutor em ABAP Objects, ou seja, não existe nenhum
método de instância que seja chamado automaticamente da memória
imediatamente antes de o objeto ser eliminado.
Os comentários correspondentes na biblioteca SAP e os caminhos de menu fora
do ABAP Workbench só estão contidos em chamadas internas do sistema.

Construtor – Exemplo

Figura 55: Construtor – Exemplo

62 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de construtores em classes locais

Após a instanciação de uma classe, um construtor é necessário quando algumas das


seguintes condições ocorrem:
● Você deve alocar recursos.
● Você deve inicializar atributos que não podem ser cobertos pelo suplemento VALUE para a
instrução DATA.
● Você modifica atributos estáticos.
● Você deve informar outros objetos sobre a criação do objeto.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar e utilizar construtores

© Direitos autorais. Todos os direitos reservados. 63


Capítulo 2 : Sintaxe básica orientada a objetos

64 © Direitos autorais. Todos os direitos reservados.


Capítulo 2
Lição 5
Implementação de construtores de classe em
classes locais

SÍNTESE DA LIÇÃO
Esta lição explica a criação e utilização de construtores estáticos e autoreferências.

Exemplo de negócio
Como desenvolvedor, você precisa explicar a criação e a utilização de construtores estáticos
para as classes em seu projeto ABAP Objects.
● Compreensão de construtores estáticos
● Compreensão da autorreferência

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar e utilizar construtores estáticos

Construtor estático

Figura 56: Exemplo de um construtor estático

© Direitos autorais. Todos os direitos reservados. 65


Capítulo 2 : Sintaxe básica orientada a objetos

O construtor estático é um método estático especial e é sempre denominado


CLASS_CONSTRUCTOR. O construtor estático é executado apenas uma vez por programa.
O construtor estático é chamado automaticamente pelo sistema antes de a classe ser
acessada pela primeira vez e antes da primeira execução das seguintes ações:
● Quando uma instância da classe (CREATE OBJECT) é criada.
● Quando um atributo estático da classe é acessado.
● Quando um método estático da classe é chamado.
● Quando um método de manipulador de eventos para um evento na classe está sendo
registrado.

Ao definir construtores estáticos, considere sempre os seguintes pontos:


● Cada classe não tem mais de um construtor estático.
● O construtor estático deve ser definido na área pública.
● O construtor estático não tem parâmetros nem exceções.
● O construtor estático não pode ser chamado explicitamente.

Autoreferência

Figura 57: Autoreferência

Em alguns casos, você também deve ter uma autorreferência disponível. No ABAP Objects,
as autoreferências são sempre predefinidas, mas só são úteis e sintaticamente disponíveis
em determinados contextos.
Você pode endereçar o próprio objeto, usando a variável de referência predefinida ME dentro
de seus métodos de instância. Nesses casos, não é necessário utilizar me-> como prefixo,
mas você pode utilizá-lo para melhorar a legibilidade.

66 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de construtores de classe em classes locais

No entanto, você deve utilizar o prefixo me-> ao distinguir entre objetos de dados locais e
atributos de instância com o mesmo nome.
Uma utilização importante da autorreferência é quando você chama um método externo e um
objeto de mandante é necessário para exportar uma referência a si mesmo, você pode utilizar
ME como um parâmetro real com EXPORTING ou CHANGING.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar e utilizar construtores estáticos

© Direitos autorais. Todos os direitos reservados. 67


Capítulo 2 : Sintaxe básica orientada a objetos

68 © Direitos autorais. Todos os direitos reservados.


Capítulo 2

Avaliação da aprendizagem

1. A instrução CLASS pode ser aninhada, ou seja, você pode definir uma classe em uma
classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. Qual dos seguintes elementos de sintaxe é utilizado para definir atributos estáticos?
Escolha a resposta correta.

X A CLASS-DATA

X B DATA

X C LIKE

3. Qual das seguintes opções é utilizada para criar um objeto?


Escolha a resposta correta.

X A CREATE OBJECT ref_name

X B Nome de referência APPEND

X C CLASS ref_name

4. Você deve criar e endereçar objetos utilizando variáveis de referência.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 69


Capítulo 2 : Avaliação da aprendizagem

5. Durante o tempo de execução do programa, você cria objetos discretos (instâncias) na


memória para uma classe existente. Esse processo é denominado instanciação.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

6. Ao chamar um método estático a partir da classe, você pode omitir o nome da classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

7. Em qual das expressões a seguir os métodos funcionais podem ser chamados


diretamente?
Escolha as respostas corretas.

X A IF

X B COMPUTE

X C MOVER

X D WHILE

8. Você pode descrever métodos que têm um parâmetro _________ como métodos
funcionais.
Escolha a resposta correta.

X A EXPORTING

X B CHANGING

X C RETURNING

9. Você tem que definir parâmetros RETURNING utilizando o suplemento VALUE, ou seja,
eles devem ser transferidos por valor.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

70 © Direitos autorais. Todos os direitos reservados.


Capítulo 2 : Avaliação da aprendizagem

10. O _____________ é um método de instância especial em uma classe.


Escolha a resposta correta.

X A construtor

X B função

X C atributos

11. O construtor de instância é chamado automaticamente no momento da execução com a


instrução CREATE OBJECT.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

12. Quais dos seguintes pontos são verdadeiros sobre o construtor estático?
Escolha a resposta correta.

X A Cada classe não tem mais do que um construtor estático.

X B O construtor estático deve ser definido na área privada.

X C A assinatura do construtor estático pode ter parâmetros de importação ou


exceções.

X D O construtor estático deve ser chamado explicitamente a partir da classe.

13. A assinatura do construtor de instância pode ter parâmetros de importação ou exceções.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 71


Capítulo 2

Avaliação da aprendizagem - Respostas

1. A instrução CLASS pode ser aninhada, ou seja, você pode definir uma classe em uma
classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Uma das características de uma classe na programação orientada a
objetos é que uma instrução de classe não pode ser aninhada, ou seja, você não pode
definir uma classe dentro de uma classe. Contudo, você pode definir classes auxiliares
locais para classes globais. Saiba mais nesta lição, Criação de classes locais,
características de tarefa de uma classe, no curso BC401.

2. Qual dos seguintes elementos de sintaxe é utilizado para definir atributos estáticos?
Escolha a resposta correta.

X A CLASS-DATA

X B DATA

X C LIKE

Você está correto! Os atributos estáticos existem uma vez para cada classe e são visíveis
para todas as instâncias de tempo de execução nessa classe. Você define atributos
estáticos com o elemento de sintaxe CLASS-DATA. Saiba mais nesta lição, Criação de
classes locais, atributos estáticos de tarefas e atributos de instância, no curso BC401.

3. Qual das seguintes opções é utilizada para criar um objeto?


Escolha a resposta correta.

X A CREATE OBJECT ref_name

X B Nome de referência APPEND

X C CLASS ref_name

Você está correto! A instrução CREATE OBJECT cria um objeto na memória. Os valores
do atributo do objeto são iniciais ou atribuídos de acordo com a especificação TYPE. Saiba
mais na tarefa Criação de objetos na lição Criação de objetos do curso BC401.

72 © Direitos autorais. Todos os direitos reservados.


Capítulo 2 : Avaliação da aprendizagem - Respostas

4. Você deve criar e endereçar objetos utilizando variáveis de referência.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! A variável de referência pode apontar para a instância de uma classe. O
valor inicial de uma variável de referência é uma referência vazia, ou seja, a referência não
aponta para nada. Saiba mais na tarefa Definição de variáveis de referência na lição
Criação de objetos do curso, BC401.

5. Durante o tempo de execução do programa, você cria objetos discretos (instâncias) na


memória para uma classe existente. Esse processo é denominado instanciação.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Uma classe contém a descrição genérica de um objeto e descreve as
características que todos os objetos nessa classe têm em comum. Durante o tempo de
execução do programa, você utiliza a classe para criar objetos discretos (instâncias) na
memória. Esse processo é denominado instanciação. Leia mais na tarefa Objetos como
instâncias de classes, na lição Criação de objetos, no curso BC401.

6. Ao chamar um método estático a partir da classe, você pode omitir o nome da classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Os métodos estáticos são abordados com o seu nome de classe, uma
vez que não necessitam de instâncias. Quando você chama um método estático a partir
da classe, pode omitir o nome da classe. Saiba mais na tarefa Chamadas de método
estático, na lição Acessando métodos e atributos, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 73


Capítulo 2 : Avaliação da aprendizagem - Respostas

7. Em qual das expressões a seguir os métodos funcionais podem ser chamados


diretamente?
Escolha as respostas corretas.

X A IF

X B COMPUTE

X C MOVER

X D WHILE

Você está correto! Você pode chamar métodos funcionais dentro das seguintes
expressões: MOVE, LOOP, Expressões lógicas: IF, ELSEIF, WHILE, CHECK, WAIT,
Expressões aritméticas e expressões de bit: COMPUTE, Case conditions: CASE, WHEN.
Saiba mais na tarefa Chamadas de método funcional, na lição Acessando métodos e
atributos, no curso BC401.

8. Você pode descrever métodos que têm um parâmetro _________ como métodos
funcionais.
Escolha a resposta correta.

X A EXPORTING

X B CHANGING

X C RETURNING

Você está correto! Os métodos que têm o parâmetro RETURNING são descritos como
métodos funcionais. Saiba mais na tarefa Chamadas de método funcional, na lição
Acessando métodos e atributos, no curso BC401.

9. Você tem que definir parâmetros RETURNING utilizando o suplemento VALUE, ou seja,
eles devem ser transferidos por valor.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O parâmetro RETURNING deve ser sempre passado por valor -
RETURNING VALUE(...) - e não por referência. Saiba mais na tarefa Chamadas de método
funcional, na lição Acessando métodos e atributos, no curso BC401.

74 © Direitos autorais. Todos os direitos reservados.


Capítulo 2 : Avaliação da aprendizagem - Respostas

10. O _____________ é um método de instância especial em uma classe.


Escolha a resposta correta.

X A construtor

X B função

X C atributos

Você está correto! O construtor de instância é um método de instância especial em uma


classe e é sempre chamado CONSTRUCTOR. Leia mais na tarefa, Construtor de instância,
na lição, Implementando construtores em classes locais, no curso, BC401.

11. O construtor de instância é chamado automaticamente no momento da execução com a


instrução CREATE OBJECT.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O construtor é automaticamente chamado com a instrução CREATE


OBJECT, no momento da execução. Leia mais na tarefa, Construtor de instância, na lição,
Implementando construtores em classes locais, no curso, BC401.

12. Quais dos seguintes pontos são verdadeiros sobre o construtor estático?
Escolha a resposta correta.

X A Cada classe não tem mais do que um construtor estático.

X B O construtor estático deve ser definido na área privada.

X C A assinatura do construtor estático pode ter parâmetros de importação ou


exceções.

X D O construtor estático deve ser chamado explicitamente a partir da classe.

Você está correto! Ao definir construtores estáticos, considere sempre os seguintes


pontos Cada classe não tem mais de um construtor estático. O construtor estático deve
ser definido na seção pública. O construtor estático não tem parâmetros nem exceções. O
construtor estático não pode ser chamado explicitamente. Leia mais na tarefa, Construtor
estático da lição, Implementando construtores de classe em classes locais, no curso
BC401.

© Direitos autorais. Todos os direitos reservados. 75


Capítulo 2 : Avaliação da aprendizagem - Respostas

13. A assinatura do construtor de instância pode ter parâmetros de importação ou exceções.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! A assinatura do construtor de instância só pode incluir parâmetros de


importação e exceções. Leia mais na tarefa, Construtor estático da lição, Implementando
construtores de classe em classes locais, no curso BC401.

76 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 3 Herança e casting

Lição 1
Implementar herança 79

Lição 2
Implementar upcasts utilizando herança 89

Lição 3
Implementar polimorfismo utilizando herança 93

Lição 4
Implementação de downcasts utilizando herança 99

OBJETIVOS DO CAPÍTULO

● Explicar generalização e especialização


● Implementar herança
● Elementos de acesso de classes na herança
● Implementar upcasts utilizando herança
● Explicar polimorfismo
● Implementar polimorfismo utilizando herança
● Implementar downcasts utilizando herança
● Hierarquias de classes de modelo

© Direitos autorais. Todos os direitos reservados. 77


Capítulo 3 : Herança e casting

78 © Direitos autorais. Todos os direitos reservados.


Capítulo 3
Lição 1
Implementar herança

SÍNTESE DA LIÇÃO
Esta lição explica o conceito de herança e sua implementação.

Exemplo de negócio
Como desenvolvedor, você precisa implementar a herança para a classe em seu projeto de
objetos ABAP. Por esse motivo, você necessita dos seguintes conhecimentos:
● Compreensão da herança
● Compreensão de generalização e especialização

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar generalização e especialização
● Implementar herança
● Elementos de acesso de classes na herança

Generalização e especialização

Figura 58: Exemplo de generalização e especialização

© Direitos autorais. Todos os direitos reservados. 79


Capítulo 3 : Herança e casting

A especialização descreve uma relação na qual uma classe (subclasse) herda todas as
características principais de outra classe (classe superior). A subclasse também pode
adicionar novos componentes (atributos, métodos, etc.) e substituir as implementações em
métodos herdados. No último caso, o nome do método no diagrama Unified Modeling
Language (UML) é renomeado dentro da subclasse.

A especialização é uma relação de implementação que enfatiza as semelhanças das classes.


No exemplo acima, os componentes comuns das classes LCL_CAR, LCL_TRUCK e LCL_BUS
são definidos no modelo UML na classe superior LCL_VEHICLE. Os componentes comuns das
subclasses só precisam ser definidos e implementados na classe superior e são herdados por
todas as subclasses.
Especialização é descrita como uma relação "é um" semanticamente. Por exemplo, um
caminhão é um veículo específico. O ponto de vista inverso é denominado generalização.

Características da generalização e especialização

Figura 59: Características da generalização e especialização

A generalização e especialização fornecem uma estrutura significativamente melhor para seu


software, pois os elementos comumente utilizados só precisam ser armazenados uma vez
em um local central (na classe superior). Esses elementos ficam automaticamente
disponíveis para todas as subclasses. As modificações efetuadas em uma fase posterior têm
um efeito imediato nas subclasses. Portanto, não altere a semântica quando você modificar
uma classe superior.
Você precisa conhecer a implementação da classe superior para decidir se os componentes
herdados da classe superior são suficientes para a subclasse ou se eles devem ser ampliados.
A generalização/especialização, portanto, fornece fortes ligações entre a classe superior e a
subclasse.
Ao desenvolver subclasses adicionais, adapte também as classes superiores. A criação de
uma subclasse às vezes leva a necessidades adicionais para a classe superior. Por exemplo,
quando uma subclasse requer determinados componentes protegidos, ou quando os
detalhes da implementação da classe superior são necessários para modificar devido às
implementações de método em subclasses. O desenvolvedor da classe superior não
consegue prever todas as necessidades que as subclasses precisam da classe superior.

80 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar herança

Implementação de herança

Figura 60: Herança – Sintaxe

No ABAP Objects, uma relação de herança é definida para uma subclasse usando o
suplemento INHERITING FROM, seguido pela classe superior diretamente acima da
subclasse. Normalmente, as hierarquias de herança de complexidade variável podem ser
criadas quando uma classe superior herda de outra classe superior, mas não existe herança
múltipla no ABAP Objects, ou seja, somente uma classe superior pode ser indicada
diretamente acima de uma classe. No entanto, você pode utilizar interfaces no ABAP Objects
para simular herança múltipla.
A herança deve ser utilizada para implementar relações de generalização e especialização.
Uma classe superior é uma generalização de suas subclasses. As subclasses são, por sua vez,
especializações diferentes de suas classes superiores. Assim, são permitidas adições ou
modificações nas subclasses, mas você nunca pode remover nada de uma classe superior em
uma subclasse.
Herança é uma relação unilateral, as subclasses reconhecem suas classes superiores diretas,
mas as classes superiores não reconhecem suas subclasses. Neste exemplo, a subclasse
também contém o método set_type. A subclasse também define o método get_cargo.

© Direitos autorais. Todos os direitos reservados. 81


Capítulo 3 : Herança e casting

Redefinição de métodos

Figura 61: Redefinir métodos

A redefinição ocorre quando a implementação de um método de instância herdado é


modificada para a subclasse, sem modificar a assinatura. Uma vez que a seção de visibilidade
para a classe superior deve permanecer a mesma, a redefinição não é possível dentro da
SEÇÃO PRIVADA.
Quando você utiliza o suplemento REDEFINITION, irá indicar uma nova implementação para o
método herdado. Como a assinatura não pode ser modificada, você não precisa definir
novamente os parâmetros do método e as exceções. Na implementação redefinida do
método, você pode utilizar o prefixo predefinido “super->...” para acessar componentes na
classe superior. Você pode precisar fazer isso ao redefinir um método para chamar o método
original da classe superior.

82 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar herança

Preservação da semântica durante a redefinição

Figura 62: Preservação da semântica durante a redefinição

Na figura Preservar semântica durante a redefinição, os dois métodos redefinidos fornecem


informações completamente diferentes.
A semântica do método permanece a mesma.

Construtores de subclasse

Figura 63: Definição do construtor em subclasses

© Direitos autorais. Todos os direitos reservados. 83


Capítulo 3 : Herança e casting

Uma redefinição, como descrito para os métodos na figura, Definição do Construtor em


Subclasses, não seria útil no caso do construtor. Na subclasse, o construtor da classe
superior pode ser utilizado sem modificações ou a subclasse foi expandida e os novos
parâmetros são agora necessários na assinatura do construtor.
No ABAP Objects, o construtor não é herdado como métodos normais. Qualquer classe pode
definir seu próprio construtor que é totalmente independente da definição do construtor em
sua classe superior. Uma subclasse pode até definir um construtor se não houver nenhum
construtor na classe superior.
No entanto, ao implementar o construtor de subclasse, é obrigatório chamar o construtor da
classe superior imediata. Ao fazer isso, é assegurado que o construtor da classe é sempre
executado, se o objeto criado é uma instância da própria classe, ou uma instância de uma de
suas subclasses.
Devido a essa chamada forçada do construtor de classe superior, o construtor de subclasse
geralmente adiciona parâmetros à assinatura do construtor de classe superior em vez de
modificá-lo completamente.

Dica:
Neste contexto, o conceito de sobrecarga é relevante. Com a sobrecarga, um
método pode ter várias definições com diferentes assinaturas e diferentes
implementações. O conceito de sobrecarga não é suportado em ABAP Objects.
A solução alternativa comum é uma assinatura com diferentes conjuntos de
parâmetros opcionais.

Ao contrário dos construtores de instância, o ambiente de tempo de execução garante


automaticamente que os construtores estáticos de todas as suas classes superiores já
tenham sido executados antes de o construtor estático em uma determinada classe ser
executado no sistema de tempo de execução.

84 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar herança

Regras para chamar o construtor

Figura 64: Regras para chamar o construtor

Se uma subclasse não tiver modificado seu construtor de instância, o construtor é adotado
da classe superior. A implementação também é herdada da classe superior.

Herança e visibilidade

Figura 65: Herança e visibilidade

© Direitos autorais. Todos os direitos reservados. 85


Capítulo 3 : Herança e casting

A herança fornece uma ampliação do conceito de visibilidade por meio de componentes


protegidos (PROTECTED SECTION). A visibilidade de componentes protegidos é entre
componentes públicos e privados. Os componentes protegidos estão visíveis para todas as
subclasses e a própria classe.
Na definição de classes locais em ABAP Objects, siga a sequência sintática da PUBLIC
SECTION, da PROTECTED SECTION e da PRIVATE SECTION.

Seção Visibilidade – Protegida versus Privada

Figura 66: Área protegida versus área privada

Os componentes herdados da classe superior podem não estar visíveis na subclasse. Uma
subclasse pode receber componentes privados de sua classe superior, que não podem ser
abordados na sintaxe da subclasse. Os componentes privados de classes superiores só
podem ser endereçados indiretamente utilizando métodos públicos ou protegidos da classe
superior, que, por sua vez, podem acessar os atributos privados. Estas restrições são
necessárias para garantir que a atualização centralizada seja possível.
Neste exemplo, é possível acessar a constante protegida C_POS_1 na classe superior
LCL_VEHICLE diretamente de sua subclasse LCL_BUS. Por outro lado, a única forma de
acessar os atributos privados MV_MAKE e MV_MODEL das subclasses de LCL_VEHICLE é
chamar métodos de LCL_VEHICLE. Esses métodos precisam ser públicos ou protegidos.
Utilizando PRIVATE SECTION, você pode modificar classes superiores sem a necessidade de
conhecer as subclasses. Desde que as modificações efetuadas por você não afetem a
semântica, você não precisa adaptar as subclasses. Isso deve-se ao fato de elas só
acessarem indiretamente os componentes privados da classe superior.

Herança e componentes estáticos


O seguinte é um resumo de componentes estáticos e herança:

86 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar herança

● Uma classe que define um atributo estático público ou protegido compartilha esse
atributo com todas as suas subclasses.
● Os métodos estáticos não podem ser redefinidos.
● O construtor estático de uma classe superior é executado quando a classe superior ou
uma de suas subclasses é acessada pela primeira vez.
● Uma subclasse pode sempre ter um construtor estático, independentemente da classe
superior.
● Se uma subclasse e sua classe superior tiverem um construtor estático, os dois
construtores serão executados quando acessarmos a subclasse pela primeira vez. Se o
acesso à classe superior e à subclasse do construtor estático ocorrer ao mesmo tempo, o
construtor estático da classe superior será executado primeiro, seguido imediatamente
pelo construtor estático da subclasse.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar generalização e especialização
● Implementar herança
● Elementos de acesso de classes na herança

© Direitos autorais. Todos os direitos reservados. 87


Capítulo 3 : Herança e casting

88 © Direitos autorais. Todos os direitos reservados.


Capítulo 3
Lição 2
Implementar upcasts utilizando herança

SÍNTESE DA LIÇÃO
Esta lição explica o conceito de up-casts e o tipo dinâmico e estático de variável de referência.
Esta lição também explica o método de implementação de up-casts.

Exemplo de negócio
Como desenvolvedor, você precisa implementar o conceito upcast para suas classes de
objeto ABAP. Por esse motivo, você precisa:
● Compreensão da herança
● Compreensão de upcasts

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar upcasts utilizando herança

Upcasts

Figura 67: Upcast (ampliação de cast) com referências a objetos

Se você atribuir uma referência de subclasse a uma referência de classe superior, essa
subclasse garante que todos os componentes que você pode acessar sintaticamente após a
atribuição cast estejam realmente disponíveis na instância. A subclasse sempre contém pelo

© Direitos autorais. Todos os direitos reservados. 89


Capítulo 3 : Herança e casting

menos os mesmos componentes que a classe superior sempre o nome e a assinatura de


métodos redefinidos são idênticos.
O usuário só pode abordar os métodos e atributos da instância de subclasse que podem da
instância de classe superior.

Dica:
Observe que, com métodos redefinidos, a implementação da subclasse é
executada utilizando o tipo estático de referência da classe superior.

Neste exemplo, após a atribuição, você só pode acessar os métodos GET_MAKE,


GET_COUNT, DISPLAY_ATTRIBUTES, SET_ATTRIBUTES e ESTIMATE_FUEL da instância
LCL_TRUCK utilizando a referência GO_VEHICLE.
Se existirem restrições relativas à visibilidade, elas serão mantidas inalteradas. Não é possível
acessar os componentes específicos a partir da classe LCL_TRUCK da instância GET_CARGO
no exemplo utilizando a referência GO_VEHICLE. A visão ou o acesso possível a métodos é
reduzido ou deixado inalterado. Há uma mudança de uma visão de vários componentes para
uma visão de poucos componentes. Como a variável de destino pode aceitar mais tipos
dinâmicos em comparação com a variável de origem, essa atribuição também é chamada de
widening cast.

Tipo estático e dinâmico

Figura 68: Tipos de referência estáticos e dinâmicos

Tipos de uma variável de referência no momento da execução na programação orientada a


objetos:
● Estática
● Dinâmico

90 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar upcasts utilizando herança

No exemplo, LCL_VEHICLE é o tipo estático da variável GO_VEHICLE. Dependendo da


atribuição cast, o tipo dinâmico é LCL_BUS ou LCL_TRUCK. No ABAP debugger, o tipo
dinâmico é indicado da seguinte forma:
object_id<\PROGRAM=program_name\CLASS=dynamic_type>

Nota:
As atribuições entre variáveis de referência são possíveis sempre que o tipo
estático das variáveis de destino for mais geral ou igual ao tipo dinâmico das
variáveis de origem.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar upcasts utilizando herança

© Direitos autorais. Todos os direitos reservados. 91


Capítulo 3 : Herança e casting

92 © Direitos autorais. Todos os direitos reservados.


Capítulo 3
Lição 3
Implementar polimorfismo utilizando herança

SÍNTESE DA LIÇÃO
Esta lição explica o polimorfismo e implementa o polimorfismo usando herança.

Exemplo de negócio
Como desenvolvedor, você precisa implementar o polimorfismo usando a herança. Por esse
motivo, você precisa:
● Compreender o polimorfismo
● Compreensão de acesso genérico e atribuições upcast

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar polimorfismo
● Implementar polimorfismo utilizando herança

Acesso genérico a objetos

Figura 69: Acesso genérico após atribuições up-cast

Um uso típico para atribuições up-cast é preparar o acesso genérico. Um usuário que não
esteja interessado nos pontos mais refinados das instâncias das subclasses, mas que

© Direitos autorais. Todos os direitos reservados. 93


Capítulo 3 : Herança e casting

simplesmente precise abordar os componentes compartilhados pode utilizar uma referência


de classe superior para esse acesso.
No exemplo, uma agência de viagens LCL_RENTAL precisa gerenciar todos os tipos
imagináveis de veículos em uma lista. Para administrar todos esses veículos em uma lista,
crie uma tabela interna e atribua a mesma com um tipo adequado para as referências às
instâncias do veículo. A empresa locadora de veículos também precisa ser capaz de calcular a
quantidade de combustível necessária para todos os seus veículos. Nesse caso, o método
DISPLAY_ATTRIBUTES, que é definido na classe superior LCL_VEHICLE, deve ser redefinido
em todas as subclasses.

Tipo de linha da tabela interna na aplicação – Exemplo

Figura 70: Tipo de linha da tabela interna na aplicação – Exemplo

Quando objetos de classes diferentes (LCL_BUS, LCL_TRUCK e LCL_CAR) são indicados


como referências de classe superior de tipo (LCL_VEHICLE), esses objetos podem ser
armazenados em uma tabela interna. Os componentes compartilhados dos objetos da
subclasse podem ser depois acessados uniformemente. Para este exemplo, você precisa do
método ADD_VEHICLE para copiar as referências aos tipos de veículo para a tabela interna. O
parâmetro de importação deste método já está tipificado como referência à classe superior.

94 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar polimorfismo utilizando herança

Up-cast e acesso genérico na aplicação – Exemplo

Figura 71: Up-cast e acesso genérico na aplicação – Exemplo

Neste exemplo, a atribuição up-cast ocorre quando a referência do veículo é transferida para
o parâmetro formal do método ADD_VEHICLE. O componente compartilhado é acessado
genericamente dentro do loop ao redor da tabela interna que contém todas as referências de
veículo. O método DISPLAY_ATTRIBUTES foi herdado da classe superior LCL_VEHICLE e
pode ter sido redefinido.

© Direitos autorais. Todos os direitos reservados. 95


Capítulo 3 : Herança e casting

Polimorfismo

Figura 72: Polimorfismo – Acesso genérico utilizando a referência de superclasse

A implementação a ser executada quando DISPLAY_ATTRIBUTES é chamada depende do


objeto ao qual a referência de classe superior LO_VEHICLE se refere. O tipo dinâmico (não o
tipo estático) da variável de referência é utilizado para procurar a implementação de um
método. Por isso, quando lo_veículo->display_attributes é chamado, a implementação não é
executada a partir de LCL_VEHICLE (tipo estático de LO_VEHICLE) porque o método foi
redefinido em todas as classes de veículo.
Quando uma instância recebe uma mensagem para executar um método específico, o
método que implementou a classe dessa instância é executado. Se a classe não tiver sido
redefinida no método, a implementação da classe superior é executada.

Características do polimorfismo
Quando objetos de diferentes classes reagem de forma diferente às mesmas chamadas de
método, isso é conhecido como polimorfismo. A possibilidade de polimorfismo é um dos
principais pontos fortes da herança. um client pode tratar diferentes classes de modo
uniforme, independentemente da sua implementação. O sistema de tempo de execução
procura a implementação correta de um método, em nome do client.
O polimorfismo pode ser utilizado para escrever programas muito genéricos, ou seja, que não
precisam de grandes modificações se forem adicionados casos de utilização. Por exemplo, o
polimorfismo pode facilitar a adição de motos a este exemplo. Você só precisa definir uma
nova subclasse de LCL_VEHICLE, que você pode chamar LCL_MOTORBIKE. Seria também
necessário redefinir o método herdado DISPLAY_ATTRIBUTES. Sem precisar de mais
modificações, seu sistema de gerenciamento de veículos pode então trabalhar com motos,
bem como calcular os níveis de combustível necessários para elas.

96 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar polimorfismo utilizando herança

Chamadas genéricas no modelo de programação procedural

Figura 73: Chamadas genéricas no modelo de programação procedural

Utilizando as chamadas dos módulos de função dinâmicos, você pode realizar uma
programação genérica no ABAP, mesmo sem um modelo de programação orientado a
objetos. Quando você compara a chamada dinâmica de módulo de função com o
polimorfismo por herança, o texto fonte é menos autoexplicativo e é mais suscetível a erros
na chamada dinâmica de módulo de função. Por exemplo, a verificação de sintaxe só pode
verificar se o módulo de função é chamado corretamente ou não. A verificação de sintaxe não
pode verificar se a tabela interna contém um nome de módulo de função válido para cada
veículo ou não.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar polimorfismo
● Implementar polimorfismo utilizando herança

© Direitos autorais. Todos os direitos reservados. 97


Capítulo 3 : Herança e casting

98 © Direitos autorais. Todos os direitos reservados.


Capítulo 3
Lição 4
Implementação de downcasts utilizando
herança

SÍNTESE DA LIÇÃO
Esta lição explica o conceito de atribuições downcast (narrowing cast).

Exemplo de negócio
Como desenvolvedor, você precisa criar uma subclasse da classe de avião e, em seguida,
utilizar o casting para acessar diferentes atributos. Por esse motivo, você precisa:
● Compreensão de downcasts
● Compreensão da herança
● Compreender a implementação de downcasts utilizando a herança

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar downcasts utilizando herança
● Hierarquias de classes de modelo

Downcasts

Figura 74: Downcast (narrowing cast) com referências a objetos

© Direitos autorais. Todos os direitos reservados. 99


Capítulo 3 : Herança e casting

As variáveis de referência da classe superior também podem se referir às instâncias de


subclasse no momento da execução. Você pode copiar esta referência de volta para uma
variável de referência do tipo de subclasse.

Para atribuir uma referência de classe superior a uma referência de subclasse, você deve
utilizar o operador de atribuição downcast MOVE ... ?TO ... ou sua forma breve ?
=. Caso contrário, você recebe uma mensagem informando que não está certo de que todos
os componentes que podem ser acessados sintaticamente após a atribuição cast estejam
realmente disponíveis na instância. Como regra, a subclasse contém mais componentes do
que a classe superior.
Depois de atribuir esse tipo de referência de volta a uma referência de subclasse à classe de
implementação, os clientes não estão mais limitados a componentes herdados. No exemplo
mostrado na figura Downcast (narrowing-cast) com referências de objeto, todos os
componentes da instância LCL_TRUCK podem ser acessados novamente após a atribuição
utilizando a referência GO_TRUCK2.
Por isso, normalmente a visão é ampliada ou não é modificada. Este tipo de atribuição de
variáveis de referência é conhecido como down-cast. Há uma mudança de uma visão de
alguns componentes para uma visão de muitos componentes. Como a variável de destino
aceita menos tipos dinâmicos após a atribuição, essa atribuição também é chamada de
narrowing cast.

Acesso específico após atribuições downcast

Figura 75: Acesso específico após atribuições downcast

As atribuições downcast são utilizadas quando você precisa abordar componentes


específicos de instâncias e manter as referências desses componentes em variáveis que são
digitadas na classe superior. Um usuário interessado nos pontos mais finos das instâncias de
uma subclasse não pode utilizar a referência de classe superior para este acesso porque só
permite o acesso aos componentes compartilhados.

100 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de downcasts utilizando herança

Tratamento de exceções para downcasts

Figura 76: Down-cast e tratamento de exceções na aplicação - Exemplo

Neste exemplo, uma locadora de veículos (LCL_RENTAL) deve determinar a capacidade


máxima de seus caminhões, mas armazena todos os tipos de referências de veículo em uma
tabela interna LCL_VEHICLE. Pode haver um problema se não houver referência de caminhão
na referência de classe superior LO_VEHICLE no momento da execução, mas o operador de
atribuição downcast tenta copiar a referência para a referência agora inválida LO_TRUCK.
Ao contrário da atribuição up-cast, é possível que o tipo estático da variável de destino
(LO_TRUCK) não seja mais geral do que nem seja o mesmo que o tipo dinâmico da variável de
origem (LO_VEHICLE), nomeadamente quando LO_VEHICLE contém referências de ônibus
ou carro esportivo. Esse é o motivo pelo qual, com este tipo de cast, o sistema de tempo de
execução verifica antes da atribuição se o conteúdo atual da variável de origem corresponde
aos requisitos de tipo da variável de destino. Caso contrário, é acionada uma exceção que
pode ser tratada e o valor original da variável de destino permanece o mesmo.
Você pode identificar esta exceção da classe de erro CX_SY_MOVE_CAST_ERROR utilizando
as instruções TRY-ENDTRY e CATCH. Outra forma de evitar este erro em tempo de execução
é utilizar classes de identificação de tipo em tempo de execução (RTTI). Você pode utilizar
classes RTTI para determinar o tipo dinâmico no momento da execução e definir uma
condição para o cast.

© Direitos autorais. Todos os direitos reservados. 101


Capítulo 3 : Herança e casting

Uso das hierarquias de classe

Figura 77: Uso das hierarquias de classe

Já na fase de modelagem, você pode identificar uma relação de generalização e


especialização entre determinadas classes. Se existir uma relação desse tipo entre
determinadas classes, você pode utilizar a herança para representar isso no ABAP Objects.
Por exemplo, a semântica deve ser preservada quando você redefine métodos. Além disso, os
componentes herdados devem ser utilizados como é pretendido na classe superior.

utilização incorreta da herança

Figura 78: Exemplos – Utilização incorreta de herança

Se você não tem uma compreensão correta da semântica de "é (específico)", corre o risco de
identificar os locais errados para usar herança. Às vezes, a necessidade de outro atributo
para uma classe é atendida incorretamente com uma especialização.
Por exemplo, uma classe superior chamada Carro contém as subclasses Carro vermelho,
Carro azul, etc. A declaração “Um carro vermelho é um carro específico” está correta apenas
à primeira vista. Contudo, não existem carros sem cor. Quando muito, existem alguns carros
que não foram pintados. Portanto, cada carro precisa da cor do atributo, assumindo que é
relevante para a aplicação. Portanto, esse atributo deve ser definido na classe superior. Pode
haver contradições com a realidade quando você tenta implementar um método para pintar
os carros.

102 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de downcasts utilizando herança

Nota:
Tais atributos também são definidos como variáveis de referência para uma
classe superior de classes de função. Existe uma classe de descrição para cada
função. Para modificar a função de uma instância, você troca depois as
referências às instâncias de descrição de função correspondentes. A literatura
especializada também se refere a isso como modelo de design de funções.

Em alguns casos, as relações de especialização que não permitem manter a semântica


precisam ser identificadas.
Por exemplo, a classe quadrada herda da classe retângulo. Se você tentar definir métodos
para o retângulo que modificam a largura e a altura separadamente, esses métodos não farão
sentido quando aplicados ao quadrado. Mesmo que os métodos sejam redefinidos para
uniformizar os comprimentos dos lados, a semântica será diferente.
Pelo mesmo motivo, isto é, utilizar a herança apenas porque algumas funções necessárias
são encontradas em uma classe superior também não é apropriada.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar downcasts utilizando herança
● Hierarquias de classes de modelo

© Direitos autorais. Todos os direitos reservados. 103


Capítulo 3 : Herança e casting

104 © Direitos autorais. Todos os direitos reservados.


Capítulo 3

Avaliação da aprendizagem

1. Quais das seguintes opções são as características da herança?


Escolha as respostas corretas.

X A Os componentes comuns só existem uma vez na classe superior

X B Os componentes nas subclasses estão disponíveis em todas as classes superiores

X C As subclasses contêm ampliações ou modificações

X D As subclasses não são dependentes de classes superiores

2. Uma classe superior é uma generalização de suas subclasses.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

3. Suponha que você tem uma classe X que herda da classe Y. Após um up-cast, uma
variável de referência que é estaticamente tipificada TYPE REF TO Y aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.

X A Componentes definidos na classe X

X B Componentes herdados da classe Y

X C Componentes redefinidos na classe X

X D Componentes definidos na classe X e redefinidos em suas subclasses

© Direitos autorais. Todos os direitos reservados. 105


Capítulo 3 : Avaliação da aprendizagem

4. Quando objetos de classes diferentes reagem de forma diferente às mesmas chamadas


de método, isso é conhecido como __________.
Escolha a resposta correta.

X A objetos

X B eventos

X C polimorfismo

X D herança

5. Uma utilização típica para atribuições ________ é preparar o acesso genérico.


Escolha a resposta correta.

X A eventos

X B upcast

X C métodos

X D downcast

6. Qual das seguintes opções é utilizada para atribuir uma referência de classe superior a
uma referência de subclasse?
Escolha a resposta correta.

X A Ampliando cast

X B narrowing cast

X C Redefinição

7. Qual das seguintes opções é o operador de atribuição downcast?


Escolha a resposta correta.

X A =

X B <>

X C ?=

X D =?

106 © Direitos autorais. Todos os direitos reservados.


Capítulo 3 : Avaliação da aprendizagem

8. Suponha que você tem a mesma classe X que herda da classe Y. Após um down-cast, uma
variável de referência que é tipificada estaticamente TYPE REF TO X aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.

X A Componentes definidos na classe X

X B Componentes herdados da classe Y

X C Componentes redefinidos na classe X

X D Componentes definidos na classe X e redefinidos em suas subclasses

9. Quais das seguintes opções são vantagens de se utilizar corretamente hierarquias de


classes?
Escolha as respostas corretas.

X A Manutenção centralizada

X B Método de acesso seguro e genérico

X C Semântica preservada

X D Utilização prevista de componentes herdados

© Direitos autorais. Todos os direitos reservados. 107


Capítulo 3

Avaliação da aprendizagem - Respostas

1. Quais das seguintes opções são as características da herança?


Escolha as respostas corretas.

X A Os componentes comuns só existem uma vez na classe superior

X B Os componentes nas subclasses estão disponíveis em todas as classes superiores

X C As subclasses contêm ampliações ou modificações

X D As subclasses não são dependentes de classes superiores

Você está correto! Os componentes comuns das subclasses só precisam ser definidos e
implementados na classe superior e são herdados por todas as subclasses. As subclasses
são, por sua vez, especializações diferentes de suas classes superiores. Por isso, são
permitidos suplementos (ampliações) ou modificações nas subclasses. Saiba mais na
tarefa Características de generalização e especialização, na lição Implementação de
herança, no curso, BC401.

2. Uma classe superior é uma generalização de suas subclasses.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! A herança deve ser utilizada para implementar relações de
generalização e especialização. Uma classe superior é uma generalização de suas
subclasses. Saiba mais na tarefa Implementação de herança, na lição Implementação de
herança, do curso BC401.

108 © Direitos autorais. Todos os direitos reservados.


Capítulo 3 : Avaliação da aprendizagem - Respostas

3. Suponha que você tem uma classe X que herda da classe Y. Após um up-cast, uma
variável de referência que é estaticamente tipificada TYPE REF TO Y aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.

X A Componentes definidos na classe X

X B Componentes herdados da classe Y

X C Componentes redefinidos na classe X

X D Componentes definidos na classe X e redefinidos em suas subclasses

Você está correto! Se você atribuir uma referência de subclasse a uma referência de
classe superior, essa subclasse garante que todos os componentes que você pode
acessar sintaticamente após a atribuição cast estejam realmente disponíveis na instância.
A subclasse sempre contém pelo menos os mesmos componentes que a classe superior
sempre o nome e a assinatura de métodos redefinidos são idênticos. Leia mais na tarefa
Upcasts, na lição, Implementando Up-casts usando Herança, claro BC401.

4. Quando objetos de classes diferentes reagem de forma diferente às mesmas chamadas


de método, isso é conhecido como __________.
Escolha a resposta correta.

X A objetos

X B eventos

X C polimorfismo

X D herança

Você está correto! Quando objetos de classes diferentes reagem de forma diferente às
mesmas chamadas de método, isso é conhecido como polimorfismo. um client pode
tratar diferentes classes de modo uniforme, independentemente da sua implementação.
O sistema de tempo de execução procura a implementação correta de um método, em
nome do client. Leia mais nas lições, Implementando Up-casts usando Herança e
Implementando Polimorfismo Usando Herança, do curso, BC401.

© Direitos autorais. Todos os direitos reservados. 109


Capítulo 3 : Avaliação da aprendizagem - Respostas

5. Uma utilização típica para atribuições ________ é preparar o acesso genérico.


Escolha a resposta correta.

X A eventos

X B upcast

X C métodos

X D downcast

Você está correto! Um uso típico para atribuições up-cast é preparar o acesso genérico.
Um usuário que não esteja interessado nos pontos mais refinados das instâncias das
subclasses, mas que simplesmente precise abordar os componentes compartilhados
pode utilizar uma referência de classe superior para esse acesso. Leia mais na tarefa,
Acesso genérico a objetos, na lição Implementação de polimorfismo utilizando herança,
do curso, BC401.

6. Qual das seguintes opções é utilizada para atribuir uma referência de classe superior a
uma referência de subclasse?
Escolha a resposta correta.

X A Ampliando cast

X B narrowing cast

X C Redefinição

Você está correto! Para atribuir uma referência de classe superior a uma referência de
subclasse, você deve utilizar a atribuição downcast, também chamada narrowing cast.
Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando herança,
claro BC401.

7. Qual das seguintes opções é o operador de atribuição downcast?


Escolha a resposta correta.

X A =

X B <>

X C ?=

X D =?

Você está correto! O operador de atribuição downcast é MOVE ... ?TO ... ou sua forma
breve ?=. Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando
herança, claro BC401.

110 © Direitos autorais. Todos os direitos reservados.


Capítulo 3 : Avaliação da aprendizagem - Respostas

8. Suponha que você tem a mesma classe X que herda da classe Y. Após um down-cast, uma
variável de referência que é tipificada estaticamente TYPE REF TO X aponta para uma
instância da classe X. Quais dos seguintes componentes da classe X você pode acessar
com esta variável de referência?
Escolha as respostas corretas.

X A Componentes definidos na classe X

X B Componentes herdados da classe Y

X C Componentes redefinidos na classe X

X D Componentes definidos na classe X e redefinidos em suas subclasses

Você está correto! Depois de atribuir um tipo de classe superior de referência a uma
referência de subclasse, os clientes não estão mais limitados a componentes herdados.
Leia mais na tarefa Downcasts, na lição, Implementando downcast utilizando herança,
claro BC401.

9. Quais das seguintes opções são vantagens de se utilizar corretamente hierarquias de


classes?
Escolha as respostas corretas.

X A Manutenção centralizada

X B Método de acesso seguro e genérico

X C Semântica preservada

X D Utilização prevista de componentes herdados

Você está correto! Os elementos comumente utilizados só precisam ser armazenados


uma vez em uma localização central (na classe superior). Esses elementos ficam
automaticamente disponíveis para todas as subclasses. As modificações efetuadas em
uma fase posterior têm um efeito imediato nas subclasses. A implementação de
poliformismo usando herança fornece o acesso genérico – uma chamada, múltiplas
implementações. Saiba mais na tarefa Utilização de hierarquias de classe na lição
Implementação de downcast utilizando herança, claro BC401.

© Direitos autorais. Todos os direitos reservados. 111


Capítulo 3 : Avaliação da aprendizagem - Respostas

112 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 4 Interfaces e casting

Lição 1
Definição e implementação de interfaces locais 115

Lição 2
Implementar polimorfismo utilizando interfaces 121

Lição 3
Integração de modelos de classe mediante interfaces 125

OBJETIVOS DO CAPÍTULO

● Explicar a utilização de interfaces


● Criar relações de generalização e especialização utilizando interfaces
● Implementar polimorfismo usando interfaces
● Implementar downcasts com interfaces
● Integrar diferentes submodelos usando interfaces
● Criar e utilizar hierarquias de interface

© Direitos autorais. Todos os direitos reservados. 113


Capítulo 4 : Interfaces e casting

114 © Direitos autorais. Todos os direitos reservados.


Capítulo 4
Lição 1
Definição e implementação de interfaces locais

SÍNTESE DA LIÇÃO
Esta lição explica o método de definição e implementação de interfaces.

Exemplo de negócio
Como desenvolvedor, você precisa criar interfaces e implementá-las em seu modelo em
objetos ABAP. Por esse motivo, você precisa:
● Compreensão do uso da interface
● Compreensão da definição de interface
● Compreensão da implementação da interface

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar a utilização de interfaces
● Criar relações de generalização e especialização utilizando interfaces

Utilização de interfaces

Figura 79: Definição central de componentes compartilhados

As interfaces diferem da herança regular em suas áreas de utilização. No entanto, em termos


de programação, dificilmente existem diferenças entre interfaces e herança regular. As

© Direitos autorais. Todos os direitos reservados. 115


Capítulo 4 : Interfaces e casting

interfaces podem ser vistas como classes superiores que não podem ser instanciadas, não
contêm implementações e só têm componentes públicos. Você pode simular várias heranças
utilizando interfaces.
No ABAP Objects, as interfaces servem principalmente para definir protocolos de interface
uniformes para serviços. Várias classes podem implementar esses serviços de diferentes
formas, mas você precisa manter a mesma semântica. Por isso, as interfaces não contêm
implementações.
Em ABAP Objects, os mesmos componentes geralmente podem ser definidos em interfaces e
classes. Para reconhecer as diferenças semânticas da herança regular, você pode se
concentrar nos seguintes casos de utilização.
Por exemplo, você quer permitir que várias classes implementem um serviço de formas
diferentes, mas utilizando os mesmos nomes de método e uma assinatura uniforme. Com a
herança normal, você definiria esse método na classe superior compartilhada. No entanto, se
você não puder modelar uma classe superior para herança adequadamente, precisará definir
uma interface e, em seguida, definir o método na interface. Portanto, você pode comparar
este caso com uma relação de generalização dentro de uma classe superior.

Definição de interfaces

Figura 80: Cliente define o protocolo

Em comparação com a herança regular, a distribuição de funções em interfaces às vezes é


diferente. geralmente o usuário define as interfaces. Nessas interfaces, o usuário descreve
técnica e semanticamente os serviços que o usuário quer que os provedores ofereçam. Cada
classe pode agora decidir por si própria se serve a interface, ou seja, se oferece realmente os
serviços definidos na interface. Assim, este caso é semelhante a uma relação de
especialização com uma subclasse.
Assim como na herança regular, o acesso a esses serviços definidos na interface é
geralmente genérico, ou seja, o acesso aos serviços utiliza uma referência que é tipificada na
interface. Como na herança, o polimorfismo também pode ser implementado em interfaces.

116 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e implementação de interfaces locais

Acesso genérico a componentes de interface

Figura 81: Interfaces na notação UML

Em UML, você representa as interfaces da mesma forma que representa classes. No entanto,
além do nome da interface, você utiliza a notação «interface». Você representa a utilização
de uma interface por uma linha pontilhada com uma seta de dois lados do usuário para a
interface. A palavra-chave «usa» é opcional.

Relações de generalização e especialização utilizando interfaces

Figura 82: Definição e implementação de uma interface

© Direitos autorais. Todos os direitos reservados. 117


Capítulo 4 : Interfaces e casting

Em ABAP Objects, você pode definir os mesmos componentes em uma interface como pode
em classes. No entanto, as interfaces não conhecem os níveis de visibilidade de seus
componentes, ou seja, todos os componentes de uma interface são públicos.
As classes implementam interfaces das seguintes formas:
● Nome da interface
O nome da interface está listado na parte de definição da classe com a instrução
INTERFACES. Isso ocorre em PUBLIC SECTION, ou seja, as interfaces só podem ser
implementadas publicamente.
● Métodos de interface
Os métodos de interface são implementados na parte de implementação da classe.
● Componentes de interface
Os componentes definidos na interface são abordados na parte de implementação da
classe.

Os componentes de interface são distinguidos dos outros componentes na classe de


implementação, prefixando o nome da interface seguido por um til (~), que é o operador de
resolução de interface.
interface_name~component_name

Acesso a componentes de interface

Figura 83: Endereçamento de componentes de interface através de referências a objetos

Você só pode acessar componentes de interface utilizando uma referência a objetos cuja
classe implementa a interface. Você utiliza o operador de resolução de interface (~) para
acessar os componentes de interface na parte de implementação da classe.

118 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e implementação de interfaces locais

Simplificação do acesso a componentes de interface com nomes de alias

Figura 84: Simplificação do acesso a componentes de interface com nomes de alias

Para simplificar o acesso a componentes da interface, você pode utilizar aliases. Esses nomes
alias podem aparecer na parte de definição de uma classe. A utilização de nomes alias está
sujeita à restrição de visibilidade da classe definidora.
Um alias para um método de interface é definido da seguinte forma:
ALIASES a_1 FOR lif_1~Method_1.
O método de interface lif_1~Method_1 pode ser acessado com o formulário mais curto ref-
>a_1.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar a utilização de interfaces
● Criar relações de generalização e especialização utilizando interfaces

© Direitos autorais. Todos os direitos reservados. 119


Capítulo 4 : Interfaces e casting

120 © Direitos autorais. Todos os direitos reservados.


Capítulo 4
Lição 2
Implementar polimorfismo utilizando
interfaces

SÍNTESE DA LIÇÃO
Esta lição explica o polimorfismo e implementa o polimorfismo usando interfaces.

Exemplo de negócio
Como desenvolvedor, você precisa criar interfaces e implementar polimorfismo em seu
projeto ABAP Objects. Por esse motivo, você precisa:
● Compreender o polimorfismo
● Compreender o polimorfismo na implementação da interface

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar polimorfismo usando interfaces

Polimorfismo com interfaces

Figura 85: Upcast com referências de interface

Uma referência de interface só pode se referir a instâncias de classes que implementaram a


interface porque as próprias interfaces não podem ser instanciadas. Como na herança

© Direitos autorais. Todos os direitos reservados. 121


Capítulo 4 : Interfaces e casting

regular, você deve utilizar upcast para copiar uma referência à variável de referência de
interface para executar polimorfismo com interfaces.
Se a classe tiver implementado a interface, é certo que todos os componentes que podem ser
acessados sintaticamente após a atribuição cast estão disponíveis na instância. Um usuário
pode acessar a instância da classe de implementação utilizando a interface. A prefixação do
nome da interface e do operador de resolução de interface é omitida. Contudo, o usuário está
restringido a utilizar os componentes da interface.
No exemplo, os métodos DISPLAY_PARTNER e CHECK_AVAILABILITY da interface
LIF_PARTNER só podem ser acessados após a atribuição da variável de referência
GO_PARTNER. Não é possível acessar os componentes específicos da instância a partir da
classe LCL_RENTAL (GET_NAME no exemplo acima) utilizando a variável de referência
GO_PARTNER.
Por isso, a visão é restringida ou, pelo menos, permanece inalterada. Por isso, você descreve
este tipo de atribuição de variáveis de referência como upcast. Existe uma mudança de uma
visão de vários componentes para uma visão de apenas alguns componentes. A referência de
destino pode, obviamente, aceitar tipos mais dinâmicos após a atribuição, do que antes.
Assim, o termo widening cast também é adequado.

Acesso genérico com interfaces

Figura 86: Agregação com uma interface

Uma área de utilização típica para atribuições upcast é a preparação para o acesso genérico.
Um usuário que não esteja interessado nos pontos mais refinados das instâncias da classe
que implementam a interface, mas que simplesmente quer abordar os componentes
definidos na interface, poderia utilizar uma referência de interface para este acesso.
No exemplo mostrado, uma agência de viagens (LCL_TRAVEL_AGENCY) precisa gerenciar os
vários tipos de parceiros de negócios em uma lista. Por isso, o desenvolvedor deve atribuir a
categoria de linha da tabela interna como referência à interface LIF_PARTNER.
A agência de viagens só quer solicitar os serviços para exibir seus atributos e verificar sua
disponibilidade. Os métodos relevantes DISPLAY_PARTNER e CHECK_AVAILABILITY são
definidos na interface LIF_PARTNER e implementados em todas as classes de parceiro de
negócios.

122 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar polimorfismo utilizando interfaces

Os objetos de diferentes classes (LCL_HOTEL, LCL_RENTAL e LCL_CARRIER no exemplo)


podem ser mantidos em uma tabela interna, tipificada com referências de interface
(LIF_PARTNER no exemplo). Os componentes definidos na interface podem ser então
acessados uniformemente.
Para este exemplo, é necessário o método ADD_PARTNER. Este método copia as referências
a todos os tipos de parceiros de negócios na tabela interna. O parâmetro de importação deste
método já está tipificado como referência à interface.

Acesso genérico utilizando a referência de interface

Figura 87: Polimorfismo – Acesso genérico utilizando a referência de interface

O polimorfismo também pode ser realizado para interfaces. Você pode utilizar referências de
interface para chamar métodos e executar diferentes implementações dependendo do objeto
da referência.
O tipo dinâmico da variável de referência é utilizado para procurar a implementação de um
método. No exemplo acima, lo_partner->display_partner( ) utiliza a classe da instância à qual
lo_partner realmente se refere para procurar a implementação de display_partner.
A implementação que é executada quando DISPLAY_PARTNER é chamado agora depende do
objeto ao qual a referência de interface lo_partner se refere atualmente. Quando objetos de
diferentes classes reagem de forma diferente às mesmas chamadas de método, é conhecido
como polimorfismo.
A opção de realizar polimorfismo é um dos principais pontos fortes das interfaces. Um
mandante pode tratar de diferentes classes de modo uniforme, independentemente da sua
implementação. O sistema de tempo de execução procura a implementação correta de um
método, em nome do client.
O polimorfismo pode ser utilizado para escrever programas muito genéricos, ou seja, que não
precisam de grandes modificações se forem adicionados casos de utilização.
No exemplo, torna-se fácil adicionar uma classe para aluguéis de barcos. Por exemplo, a
classe relevante com o nome LCL_SHIPPING terá que simplesmente implementar a interface

© Direitos autorais. Todos os direitos reservados. 123


Capítulo 4 : Interfaces e casting

LIF_PARTNER e o método DISPLAY_PARTNER definido aí. A administração de parceiros de


negócios pode incluir facilmente empresas proprietárias da expedição e solicitar que elas
exibam seus atributos.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar polimorfismo usando interfaces

124 © Direitos autorais. Todos os direitos reservados.


Capítulo 4
Lição 3
Integração de modelos de classe mediante
interfaces

SÍNTESE DA LIÇÃO
Esta lição explica o método de junção de modelos de classe utilizando interfaces.

Exemplo de negócio
Como desenvolvedor, você precisa integrar vários modelos de classe de seu projeto ABAP
Objects. Por esse motivo, você precisa:
● Compreensão de submodelos
● Compreensão da integração de submodelos
● Compreensão de hierarquias de interface

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar downcasts com interfaces
● Integrar diferentes submodelos usando interfaces
● Criar e utilizar hierarquias de interface

© Direitos autorais. Todos os direitos reservados. 125


Capítulo 4 : Interfaces e casting

Downcasts com interfaces

Figura 88: Atribuição down-cast e tratamento de exceções no exemplo de aplicação

Para atribuir uma referência de interface a uma referência de classe onde a classe
implementou a interface, você deve utilizar o operador de atribuição down-cast MOVE ... ?
TO ... ou sua forma breve ?=. Caso contrário, o sistema devolve uma mensagem informando a
você que não há garantias de que todos os componentes que podem ser acessados
sintaticamente após a atribuição cast estejam realmente disponíveis na instância. Regra
geral, a classe de implementação contém mais componentes do que a interface.
As variáveis de referência da interface podem conter referências a instâncias da classe de
implementação no momento da execução. Após a atribuição deste tipo de referência a uma
referência à classe de implementação, os mandantes já não estão limitados a componentes
de interface.
Este tipo de atribuição de variável de referência é descrito como down-casting. A visão down-
casting é ampliada ou pelo menos inalterada. Isto é uma mudança de uma visão de alguns
componentes para uma visão de mais componentes. O termo narrowing cast também é
usado.
Uma área de utilização típica para atribuições down-cast é quando componentes específicos
de instâncias precisam ser endereçados e suas referências são mantidas em variáveis
tipificadas na interface. Um usuário interessado nos pontos mais refinados das instâncias em
classes de implementação não pode utilizar a referência de interface porque a atribuição
downcast só permite o acesso aos componentes de interface. No exemplo mostrado na figura
Atribuição down-cast e tratamento de exceções no exemplo de aplicação, uma agência de
viagens (LCL_TRAVEL_AGENCY) precisa reservar um voo, mas mantém todas as várias
referências de parceiro de negócios em uma tabela interna que foi digitada na interface
LIF_PARTNER.
O que acontece se não existir nenhuma referência de companhia aérea na referência de
interface GO_PARTNER no momento da execução, mas o operador de atribuição down-cast
for utilizado para copiar a referência para a referência então inválida GO_CARRIER? Ao

126 © Direitos autorais. Todos os direitos reservados.


Lição: Integração de modelos de classe mediante interfaces

contrário da atribuição up-cast, é possível que o tipo estático da variável de destino


(GO_CARRIER) não seja mais geral nem igual ao tipo dinâmico das variáveis de origem
(GO_PARTNER), especialmente se GO_PARTNER contiver referências a hotéis ou veículos de
aluguel.
O sistema de tempo de execução verifica este tipo de cast antes da atribuição, se o conteúdo
atual da variável de origem corresponde ou não aos requisitos de tipo da variável de destino.
Caso contrário, é acionada uma exceção que pode ser tratada e o valor original da variável de
destino permanece igual. Esta exceção da classe de erro CX_SY_MOVE_CAST_ERROR pode
ser identificada, utilizando TRY-ENDTRY e a instrução CATCH.
Outra forma de evitar este erro em tempo de execução seria utilizar classes de identificação
de tipo em tempo de execução (RTTI). Elas podem ser utilizadas para determinar o tipo
dinâmico no momento da execução e para definir uma condição para o cast.
As atribuições entre variáveis de referência de interface, cujas interfaces de atribuição de tipo
não estão relacionadas entre si, não podem ser verificadas estaticamente e, por isso, devem
ser executadas utilizando down-cast. Com essa atribuição, o sistema verifica no momento da
execução se a classe da instância à qual a referência de origem se refere também suporta a
interface com a qual a referência de destino é tipificada.

Integração de submodelos mediante interfaces


Os submodelos podem ser integrados com a ajuda de interfaces.

● As etapas para integrar um submodelo utilizando interfaces são as seguintes:

1. Criar classes do submodelo.

2. Inclua a interface indicada na classe do servidor do submodelo. (O protocolo é definido


pelo cliente.)

3. Crie instâncias de classe de servidor e referencie-as com referência de interface.

Implementação de hierarquias de interface

Figura 89: Hierarquia de interface no exemplo de aplicação

© Direitos autorais. Todos os direitos reservados. 127


Capítulo 4 : Interfaces e casting

Uma implementação de interface se assemelha muito à herança regular. Com herança


regular, você pode definir grandes hierarquias de classes. Quando usamos interfaces em vez
de classes, chamamos de hierarquias de interface. Gostaríamos de ilustrar essa técnica com
um exemplo de aplicação.
Neste exemplo, você precisa saber se é útil definir outro serviço para "reserva de sala" na
interface LIF_PARTNER. Nesse caso, as classes LCL_CARRIER e LCL_RENTAL precisam
implementar o método apropriado porque estão integradas com a interface LIF_PARTNER.
No entanto, não é possível manter a mesma semântica para companhias aéreas ou locadoras
de veículos quando implementamos o serviço de "reserva de quarto".
No entanto, como existem vários outros tipos de parceiros de negócios para os quais esta
implementação é útil, por exemplo, motéis e hotéis, o método precisa ser definido
centralmente e não individualmente para motéis e hotéis. Se também for necessário ampliar
o modelo com outros tipos de provedor de hospedagem, por exemplo, Guesthouses, a
hierarquia da interface precisa ser mantida.

Notação de interface composta em Unified Modeling Language (UML)

Figura 90: Interface composta na notação UML

No ABAP Objects, interfaces como classes superiores regulares podem incluir outras
interfaces. Tal como na herança regular, as hierarquias de interface podem ter qualquer
profundidade.
A interface de inclusão é uma especialização da interface incluída. A interface de inclusão é
conhecida como uma interface composta, representa uma extensão da interface incluída.
Uma interface incluída representa um componente de outra interface e é portanto conhecida
como interface de componentes. Uma interface que não contém outras interfaces em si é
conhecida como interface elementar.
A notação UML corresponde à implementação de uma interface elementar por uma classe.

128 © Direitos autorais. Todos os direitos reservados.


Lição: Integração de modelos de classe mediante interfaces

Definição e implementação de interfaces compostas – Sintaxe

Figura 91: Definição e implementação de interfaces compostas – Sintaxe

Tal como na herança normal, a classe de implementação só precisa listar a interface


composta de modo a integrar todos os componentes. Contudo, os componentes das
interfaces de componentes mantêm seus nomes originais:
component_interface_name~component_name
Por isso, eles não têm como prefixo o nome da interface composta.
Todas as implementações de métodos de todas as interfaces superiores devem ser
efetuadas na primeira classe de implementação. Os nomes de alias são adequados para
sintaxe breve ao acessar componentes de diferentes interfaces. Se a classe de
implementação contiver aliases, ela fornece uma visão central de todos os componentes.

© Direitos autorais. Todos os direitos reservados. 129


Capítulo 4 : Interfaces e casting

Endereçamento de componentes em interfaces compostas – Sintaxe

Figura 92: Endereçamento de componentes em interfaces compostas – Sintaxe

Você precisa abordar os componentes de uma interface composta e efetuar atribuições cast
da mesma forma.

Utilização correta de interfaces

Figura 93: Utilizar interfaces

As interfaces são utilizadas para descrever protocolos para a utilização de componentes sem
conectar qualquer implementação. Uma camada intermediária é introduzida para proteger o
cliente do servidor explícito, tornando assim o cliente independente.
As interfaces permitem que diferentes classes sejam tratadas de modo uniforme, desde que
essas classes tenham implementado as interfaces. Tal como na herança, você também pode
executar polimorfismo, utilizando variáveis de referência de interface.

130 © Direitos autorais. Todos os direitos reservados.


Lição: Integração de modelos de classe mediante interfaces

Como é o caso com herança regular, a definição de uma interface significa a abstração das
classes de implementação para um aspecto específico.
Várias heranças podem ser simuladas utilizando interfaces. Se estiverem incluídas várias
interfaces, todos os componentes estão disponíveis para cada uma das interfaces e você
deve implementar todos os métodos.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar downcasts com interfaces
● Integrar diferentes submodelos usando interfaces
● Criar e utilizar hierarquias de interface

© Direitos autorais. Todos os direitos reservados. 131


Capítulo 4 : Interfaces e casting

132 © Direitos autorais. Todos os direitos reservados.


Capítulo 4

Avaliação da aprendizagem

1. Você só pode acessar componentes de interface utilizando uma referência a objetos.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. Qual das seguintes opções é a principal força das interfaces?


Escolha a resposta correta.

X A Eventos

X B Herança

X C Polimorfismo

3. ?= é o operador de atribuição down-cast.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

4. Suponha que uma variável de referência que é tipificada para uma interface contém uma
referência de instância de uma classe que implementa essa interface e você copia isso
para uma variável de referência que é tipificada para a classe (down-cast). Quais dos
seguintes componentes podem ser acessados com essa variável de referência?
Escolha as respostas corretas.

X A Os componentes da interface

X B Os componentes da classe que não estão definidos na interface

X C Todos os componentes da classe

X D Os componentes da interface para os quais foram definidos aliases

© Direitos autorais. Todos os direitos reservados. 133


Capítulo 4 : Avaliação da aprendizagem

5. Qual das seguintes opções se assemelha muito à herança?


Escolha a resposta correta.

X A Interface

X B Classe

X C Método

6. Interfaces podem incluir outras interfaces.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

134 © Direitos autorais. Todos os direitos reservados.


Capítulo 4

Avaliação da aprendizagem - Respostas

1. Você só pode acessar componentes de interface utilizando uma referência a objetos.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Você só pode acessar componentes de interface de instância


utilizando uma referência a objetos cuja classe implemente a interface. Mas você pode
acessar componentes estáticos utilizando o nome da interface. Saiba mais na tarefa
Acesso a componentes de interface na lição Definição e implementação de interfaces
locais do curso BC401.

2. Qual das seguintes opções é a principal força das interfaces?


Escolha a resposta correta.

X A Eventos

X B Herança

X C Polimorfismo

Você está correto! A opção de realizar polimorfismo é um dos principais pontos fortes das
interfaces. Um mandante pode tratar de diferentes classes de modo uniforme,
independentemente da sua implementação. Leia mais na tarefa Acesso genérico
utilizando a referência de interface, na lição Implementação de polimorfismo utilizando
interfaces, no curso BC401.

3. ?= é o operador de atribuição down-cast.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Para atribuir uma referência de interface a uma referência de classe
onde a classe implementou a interface, você deve utilizar o operador de atribuição down-
cast MOVE ... ?TO ... ou sua forma breve ?=. Saiba mais na tarefa Downcasts com
interfaces na lição Integração de modelos de classe utilizando interfaces, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 135


Capítulo 4 : Avaliação da aprendizagem - Respostas

4. Suponha que uma variável de referência que é tipificada para uma interface contém uma
referência de instância de uma classe que implementa essa interface e você copia isso
para uma variável de referência que é tipificada para a classe (down-cast). Quais dos
seguintes componentes podem ser acessados com essa variável de referência?
Escolha as respostas corretas.

X A Os componentes da interface

X B Os componentes da classe que não estão definidos na interface

X C Todos os componentes da classe

X D Os componentes da interface para os quais foram definidos aliases

Você está correto! A visão down-casting é ampliada ou pelo menos inalterada. Isto é uma
mudança de uma visão de alguns componentes para uma visão de mais componentes. O
termo narrowing cast também é usado. Saiba mais na tarefa Downcasts com interfaces
na lição Integração de modelos de classe utilizando interfaces, no curso BC401.

5. Qual das seguintes opções se assemelha muito à herança?


Escolha a resposta correta.

X A Interface

X B Classe

X C Método

Você está correto! Uma implementação de interface se assemelha muito à herança


regular. Com herança regular, você pode definir grandes hierarquias de classes. Quando
usamos interfaces em vez de classes, chamamos de hierarquias de interface. Saiba mais
na tarefa Implementação de hierarquias de interface, na lição Integração de modelos de
classe utilizando interfaces, no curso BC401.

6. Interfaces podem incluir outras interfaces.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! No ABAP Objects, interfaces como classes superiores regulares
podem incluir outras interfaces. Tal como na herança regular, as hierarquias de interface
podem ter qualquer profundidade. Leia mais na Interface composta na notação de
Linguagem de modelagem unificada (UML), na lição Integração de modelos de classe
utilizando interfaces, no curso BC401.

136 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 5 Eventos orientados a objetos

Lição 1
Implementação de eventos em classes locais 139

Lição 2
Implementar eventos em interfaces locais 149

OBJETIVOS DO CAPÍTULO

● Implementar chamadas de método controladas por eventos


● Acionar e tratar eventos
● Registrar para eventos
● Explicar seções de visibilidade no tratamento de eventos
● Implementar eventos em interfaces locais

© Direitos autorais. Todos os direitos reservados. 137


Capítulo 5 : Eventos orientados a objetos

138 © Direitos autorais. Todos os direitos reservados.


Capítulo 5
Lição 1
Implementação de eventos em classes locais

SÍNTESE DA LIÇÃO
Esta lição explica o método de implementação de eventos em classes locais.

Exemplo de negócio
Como desenvolvedor, você precisa implementar um comportamento controlado por eventos
para seu modelo no ABAP Objects. Por esse motivo, você precisa:
● Compreensão de como definir e acionar eventos
● Compreensão de como lidar com eventos
● Compreensão de como registrar manipuladores para eventos
● Compreensão de como implementar manipuladores de eventos em classes locais

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar chamadas de método controladas por eventos
● Acionar e tratar eventos
● Registrar para eventos
● Explicar seções de visibilidade no tratamento de eventos

© Direitos autorais. Todos os direitos reservados. 139


Capítulo 5 : Eventos orientados a objetos

Chamadas de método controladas por eventos

Figura 94: Chamadas de método controladas por eventos

Além de atributos e métodos, as classes e suas instâncias também podem conter outro tipo
de componente chamado eventos.
Os eventos de instância podem ser acionados pelas instâncias da classe, mas os eventos
estáticos podem ser acionados pela própria classe.
Os eventos também podem ser definidos como componentes de interface.
Dadas as circunstâncias corretas, os métodos de manipulador reagem ao acionamento deste
evento. Isso significa que o sistema de tempo de execução pode chamar esses métodos de
manipulador após o acionamento do evento. Em outras palavras, o mandante normalmente
não chama o método de manipulador diretamente.
Isso resulta em um conceito de modelagem completamente diferente. durante o
desenvolvimento da classe que aciona o evento, você não precisa saber nada sobre a classe
que o está manipulando. A classe acionadora envia uma mensagem específica a todas as
classes e, se necessário, às suas instâncias. No momento do desenvolvimento, o tipo de
manipulador e o número de manipuladores, que podem ser utilizados, não são conhecidos.
Devido à definição do método de manipulador, o intervalo de resultados possíveis pode ser
reduzido. No entanto, os resultados que podem ocorrer só podem ser determinados depois
de o evento ter sido acionado.
Um evento pode ter parâmetros de exportação, o que significa que, ao contrário da chamada
de método explícita, o programa de chamada determina o protocolo.
Neste exemplo de aplicação, após uma instância ser criada na classe Veículo, a instância
aciona o evento Veículo criado.
Este evento é recebido por várias instâncias e é processado de forma diferente por cada
instância. Por exemplo, a locadora de veículos lida com a compra de um veículo, enquanto o
escritório de registro do veículo registra o veículo comprado.

140 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de eventos em classes locais

Cuidado:
Não confunda este conceito de eventos na programação orientada a objetos
com eventos no sistema de tempo de execução ABAP, como LOAD-OF-
PROGRAM, START-OF-SELECTION, etc. Além disso, não confunda este conceito
com o processamento em background ou com o controle de workflow.

Manipulação de eventos em um diagrama de classe UML

Figura 95: Manipulação de eventos em um diagrama de classe UML

Nos diagramas de classe UML, uma seta pontilhada com o estereótipo «handlesEventOf»
aponta da classe de manuseio para a classe de acionamento. A definição de evento e a
assinatura só aparecem implicitamente na classe de tratamento dentro do método de
manipulador. Os métodos de manipulador são separados dos outros métodos, utilizando o
estereótipo «ManipuladorEventos».

© Direitos autorais. Todos os direitos reservados. 141


Capítulo 5 : Eventos orientados a objetos

Acionamento e tratamento de eventos

Figura 96: Definição e acionamento de eventos – Sintaxe

Dependendo do status da sua aplicação, talvez você não precise programar todas as etapas
todas as vezes. A separação de causa e efeito em sua programação deve ser refletida na
forma como você constrói aplicações complexas. Muitas vezes, o evento já foi acionado e
tudo o que você precisa fazer é criar outro manipulador de eventos.
Dentro de uma classe, os eventos de instância são definidos utilizando a instrução EVENTS,
enquanto os eventos estáticos são definidos utilizando a instrução CLASS-EVENTS. Os
eventos só podem ter parâmetros de exportação que devem ser transferidos por valor.
Uma classe ou instância pode acionar um evento no momento da execução, utilizando a
instrução RAISE EVENT. Ambos os eventos de instância e os eventos estáticos podem ser
acionados em métodos de instância. Em métodos estáticos, você só pode acionar eventos
estáticos.
Quando um evento é acionado, os métodos de manipulador registrados nesse evento são
chamados em sequência. Esses métodos de manipulador podem acionar mais eventos
próprios.

142 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de eventos em classes locais

Manipulação de eventos – Sintaxe

Figura 97: Manipulação de eventos – Sintaxe

Os eventos de instância ou os métodos estáticos podem ser definidos dentro de uma classe
para manipular eventos. Para isso, você deve indicar o evento utilizando a instrução FOR
EVENT e a classe ou interface na qual o evento foi definido utilizando a instrução OF.
Se o evento contiver parâmetros de exportação e você quiser acessá-los sintaticamente, você
deverá ter indicado os parâmetros de exportação exatamente após IMPORTING na definição
do método. Os parâmetros de exportação de assinatura do método de manipulador são todos
que podem ser incluídos explicitamente do que os parâmetros de exportação do evento
associado. Os parâmetros são digitados pelo método de manipulador durante a definição do
evento. O objeto que aciona o evento determina o protocolo.
Além dos parâmetros de exportação explicitamente definidos, o parâmetro de importação
predefinido SENDER pode ser sempre listado. Ao utilizar esse parâmetro, você pode colocar
uma referência ao objeto acionador de evento no método de manipulador.
Por isso, os métodos de manipulador são normalmente chamados por eventos acionados
RAISE EVENT. contudo, eles também podem ser chamados explicitamente (CALL METHOD).

Para acionar e processar eventos


Este procedimento resume todas as etapas de programação necessárias para o controle de
eventos:

1. Definir um evento em uma classe. A sintaxe para isso é o nome do evento EVENTS, nome
do evento CLASS-EVENTS.

2. Acione o evento em um método desta classe. A sintaxe para isso é RAISE EVENT
eventname.

© Direitos autorais. Todos os direitos reservados. 143


Capítulo 5 : Eventos orientados a objetos

3. Defina e implemente o método de manipulador no mesmo ou em outro. A sintaxe para


isso é [CLASS -] METHODS … FOR EVENT …. OF.

4. Registre o objeto do manipulador ou a classe do manipulador para eventos no momento


da execução. A sintaxe para isso é SET HANDLER.

Registro do manipulador de eventos

Figura 98: Registro do manipulador de eventos

A definição do método de manipulador só indica como e a que evento de que classe o método
irá reagir. No momento da execução, é necessário determinar quais as possíveis reações que
realmente ocorrerão e quando cada uma dessas reações ocorrerá.
Ao acionar eventos de instância, você também tem que indicar que evento a reação irá
acionar. Se os métodos de instância estiverem definidos para executar a reação, você
também tem que indicar que instâncias irão executar a reação.

Estas indicações são conhecidas coletivamente como registro. O registro é sempre efetuado
mediante o trigger. Quando o evento é acionado, o tempo de execução utiliza os registros do
acionador para determinar que métodos de manipulador de eventos precisam ser chamados.
Neste exemplo, os métodos de manipulador são definidos para o evento da classe de veículo,
da classe de veículo de aluguel e da classe de registro de veículo. No entanto, você só pode
predefinir que instâncias de locação de veículos e instâncias de registro de veículo irão reagir
a que instância de veículo e quando irão reagir.
Os registros também podem ser anulados.

144 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de eventos em classes locais

Registro da manipulação de eventos – Sintaxe

Figura 99: Registro da manipulação de eventos – Sintaxe

Os eventos são registrados utilizando a instrução SET HANDLER. O registro só está ativo no
momento da execução do programa.
Com os eventos de instância, FOR é seguido da referência ao objeto que aciona o evento.
O suplemento ACTIVATION 'X' é opcional durante o registro. Para anular o registro, utilize
ATIVAÇÃO ' '.
Você pode registrar vários métodos com uma instrução SET HANDLER:
SET HANDLER ref_handler_1->on_eventname_1 ...
ref_handler_n->on_eventname_n FOR ...

Cuidado:
Se foram registrados vários métodos para um evento, a sequência em que os
métodos de manipulador de eventos são chamados não está definida, ou seja,
não há uma sequência garantida de chamada dos métodos de manipulador de
eventos.

Com a adição de ALL INSTANCES, um manipulador de eventos pode ser registrado para
todas as instâncias da classe que define o evento de instância. Esta é a única forma de
registrar manipuladores para instâncias que ainda não foram criadas.

© Direitos autorais. Todos os direitos reservados. 145


Capítulo 5 : Eventos orientados a objetos

Anulação de registro do manipulador de eventos

Figura 100: Tabelas de manipulador de registro/cancelamento de registro

Cada objeto ou classe que define eventos tem uma tabela interna conhecida como tabela de
manipulador. Todos os métodos de manipulador registrados nos vários eventos são listados
na tabela de manipuladores. Para métodos de instância, a tabela de manipuladores também
contém referências aos objetos registrados.

Dica:
Os objetos registrados para o tratamento de eventos não são eliminados pelo
coletor de lixo, mesmo que não existam referências restantes aos mesmos.

Nota:
É possível adicionar ou remover manipuladores de eventos para um determinado
evento enquanto um manipulador de eventos para esse evento exato for
executado. Se um novo manipulador de eventos for registrado, ele será
adicionado ao final da sequência e executado no momento correto. Se o registro
de um manipulador de eventos existente for cancelado, esse manipulador será
eliminado da sequência de métodos do manipulador de eventos.

Áreas de visibilidade na manipulação de eventos


Os eventos estão sujeitos ao conceito de visibilidade e, portanto, podem ser considerados
públicos, protegidos ou privados. Os métodos de manipulador de eventos também têm
atributos de visibilidade.

146 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de eventos em classes locais

Seções de visibilidade de eventos

● A visibilidade de um evento define onde o evento pode ser tratado:


- PÚBLICO
O evento pode ser tratado em qualquer lugar.
- PROTECTED
O evento só pode ser tratado dentro de sua própria classe ou suas subclasses.
- PRIVATE
O evento só pode ser tratado dentro de sua própria classe.

Áreas de visibilidade de métodos de manipulador

● A visibilidade de um manipulador de eventos define onde o método de manipulador pode


ser registrado:
- PÚBLICO
O método do manipulador pode ser registrado em qualquer lugar no programa.
- PROTECTED
O método de manipulador pode ser registrado em sua própria classe ou suas
subclasses.
- PRIVATE
O método de manipulador só pode ser registrado em sua própria classe.

Os métodos de manipulador de eventos só podem ter a mesma ou mais visibilidade que os


eventos aos quais se referem.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar chamadas de método controladas por eventos
● Acionar e tratar eventos
● Registrar para eventos
● Explicar seções de visibilidade no tratamento de eventos

© Direitos autorais. Todos os direitos reservados. 147


Capítulo 5 : Eventos orientados a objetos

148 © Direitos autorais. Todos os direitos reservados.


Capítulo 5
Lição 2
Implementar eventos em interfaces locais

SÍNTESE DA LIÇÃO
Esta lição explica a implementação de eventos em interfaces locais.

Exemplo de negócio
Como desenvolvedor, você precisa implementar eventos em classes locais do avião. Por esse
motivo, você precisa:
● Compreensão de eventos
● Compreensão de interfaces
● Compreensão da implementação de eventos em interfaces locais

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar eventos em interfaces locais

Eventos em interfaces locais


Os eventos podem ser definidos como componentes de interface.
Os eventos de acionamento e manuseio são feitos da mesma forma que nas classes.

● As etapas para implementar o tratamento de eventos para interfaces são as seguintes:

1. Definir o evento em uma interface.

2. Acionar o evento de interface em classes de implementação.

3. Tratar evento de interface na classe do manipulador (classe do mandante).

4. Registrar manipulação de eventos.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar eventos em interfaces locais

© Direitos autorais. Todos os direitos reservados. 149


Capítulo 5 : Eventos orientados a objetos

150 © Direitos autorais. Todos os direitos reservados.


Capítulo 5

Avaliação da aprendizagem

1. Quais das seguintes opções não podem ser definidas como componentes de interface?
Escolha a resposta correta.

X A Atributos

X B Métodos

X C Eventos

X D classes

2. Qual das seguintes afirmações é utilizada para acionar eventos?


Escolha a resposta correta.

X A CLASS-EVENTS

X B RAISE EVENT

X C EVENTS

X D PARA EVENTOS

3. Você só pode acionar eventos estáticos em métodos estáticos.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

4. Qual das seguintes opções é indicada pela definição do método de manipulador?


Escolha a resposta correta.

X A Qual método reagirá a qual evento de qual classe

X B Que instâncias irão executar a reação

© Direitos autorais. Todos os direitos reservados. 151


Capítulo 5 : Avaliação da aprendizagem

5. Os métodos de manipulador são registrados utilizando a instrução SET HANDLER. O


registro só está ativo no momento da execução do programa.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

6. Em qual área de visibilidade um evento precisaria ser definido para garantir que ele só
possa ser tratado na própria classe e suas subclasses?
Escolha a resposta correta.

X A Autoridades

X B Protegido

X C Privada

152 © Direitos autorais. Todos os direitos reservados.


Capítulo 5

Avaliação da aprendizagem - Respostas

1. Quais das seguintes opções não podem ser definidas como componentes de interface?
Escolha a resposta correta.

X A Atributos

X B Métodos

X C Eventos

X D classes

Você está correto! Os atributos e métodos podem ser definidos como componentes de
interface. Os eventos também podem ser definidos como componentes de interface.
Saiba mais na tarefa Chamadas de método controlado por eventos, na lição
Implementação de eventos em classes locais, no curso BC401.

2. Qual das seguintes afirmações é utilizada para acionar eventos?


Escolha a resposta correta.

X A CLASS-EVENTS

X B RAISE EVENT

X C EVENTS

X D PARA EVENTOS

Você está correto! Uma classe ou instância pode acionar um evento no momento da
execução, utilizando a instrução RAISE EVENT. Ambos os eventos de instância e os
eventos estáticos podem ser acionados em métodos de instância. Em métodos estáticos,
você só pode acionar eventos estáticos. Leia mais na tarefa Acionamento e manuseio de
eventos, na lição Implementação de eventos em classes locais, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 153


Capítulo 5 : Avaliação da aprendizagem - Respostas

3. Você só pode acionar eventos estáticos em métodos estáticos.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Em métodos estáticos, você só pode acionar eventos estáticos. Leia
mais na tarefa Acionamento e manuseio de eventos, na lição Implementação de eventos
em classes locais, no curso BC401.

4. Qual das seguintes opções é indicada pela definição do método de manipulador?


Escolha a resposta correta.

X A Qual método reagirá a qual evento de qual classe

X B Que instâncias irão executar a reação

Você está correto! É possível definir métodos estáticos ou de instância dentro de uma
classe para tratar eventos. Para isso, você deve indicar o evento na definição do
manipulador utilizando a instrução FOR EVENT e a classe ou interface na qual o evento foi
definido utilizando a instrução OF. Saiba mais na tarefa Manipulação de eventos, na lição
Implementação de eventos em classes locais do curso BC401.

5. Os métodos de manipulador são registrados utilizando a instrução SET HANDLER. O


registro só está ativo no momento da execução do programa.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Os eventos são registrados utilizando a instrução SET HANDLER. O
registro só está ativo no momento da execução do programa. Saiba mais na tarefa
Registro de manipulação de eventos na lição Implementação de eventos em classes locais
do curso BC401.

154 © Direitos autorais. Todos os direitos reservados.


Capítulo 5 : Avaliação da aprendizagem - Respostas

6. Em qual área de visibilidade um evento precisaria ser definido para garantir que ele só
possa ser tratado na própria classe e suas subclasses?
Escolha a resposta correta.

X A Autoridades

X B Protegido

X C Privada

Você está correto! A visibilidade de um evento define onde o evento pode ser tratado:
PUBLIC - O evento pode ser tratado em qualquer lugar, PROTECTED - O evento só pode
ser tratado dentro de sua própria classe ou suas subclasses, PRIVATE - O evento só pode
ser tratado dentro de sua própria classe. Saiba mais na tarefa, Visibilidade de seções de
eventos, na lição Implementação de eventos em classes locais, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 155


Capítulo 5 : Avaliação da aprendizagem - Respostas

156 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 6 Objetos do repositório
orientados a objetos

Lição 1
Criação de classes globais 159

Lição 2
Definição e implementação de interfaces globais 169

Lição 3
Utilização de outras funções do Class Builder 175

OBJETIVOS DO CAPÍTULO

● Criar classes globais


● Testar classes globais
● Utilizar classes globais
● Definir e implementar interfaces globais
● Importar classes e interfaces locais
● Gerar diagramas UML para classes globais
● Implementar herança em classes globais
● Modificar a exibição de componentes em classes globais

© Direitos autorais. Todos os direitos reservados. 157


Capítulo 6 : Objetos do repositório orientados a objetos

158 © Direitos autorais. Todos os direitos reservados.


Capítulo 6
Lição 1
Criação de classes globais

SÍNTESE DA LIÇÃO
Esta lição explica como criar classes globais.

Exemplo de negócio
Como desenvolvedor, você deve criar uma classe ABAP global para aviões que podem ser
acessados por todos os outros objetos ABAP no sistema da SAP. Por esse motivo, você
precisa:
● Compreensão de classes globais
● Compreensão de como testar e utilizar classes globais

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Criar classes globais
● Testar classes globais
● Utilizar classes globais

Definição de classes globais

Nota:
Um grande número de números é utilizado na lição. Observe que o aspecto de
alguns dos ícones ou menus depende do nível de release.

Tal como com subprogramas, utilize classes ou interfaces locais somente dentro do
programa no qual estão definidas e implementadas. A instrução CLASS é uma declaração
local no programa. Como a instrução TYPES define tipos de dados locais, a instrução CLASS
define tipos de objeto locais.
Por outro lado, as classes globais ou interfaces globais são objetos de repositório individuais
com todas as funcionalidades padrão do ABAP Workbench, como integração ativa, criação de
versões e sistema de transporte. A convenção de espaço de nomes, por exemplo, Y*, Z*, ou
um espaço de nomes de cliente especial é igual ao nome utilizado para o espaço de nomes de
outros objetos do repositório.
Portanto, uma ferramenta especial de atualização está disponível no ABAP Workbench, que é
o Class Builder.
Se você não tiver certeza sobre um determinado recurso no Class Builder, é aconselhável
utilizar a informação rápida. É o texto explicativo que aparece quando você posiciona o cursor
sobre um ícone e o deixa lá por um curto período de tempo.

© Direitos autorais. Todos os direitos reservados. 159


Capítulo 6 : Objetos do repositório orientados a objetos

Criação de classes globais no Object Navigator

Figura 101: Criação de classes globais no Object Navigator

Tal como com outros objetos do repositório, a área de navegação separada do Object
Navigator torna a ferramenta de desenvolvimento ideal para todos os objetos do repositório.
A forma mais fácil de criar uma nova classe global é utilizar o menu de contexto na área de
navegação. Para isso, selecione primeiro o nó de pacote ou o nó de classe dentro de um
pacote.
Aparece uma caixa de diálogo que oferece algumas opções para a nova classe. Selecione
Classe ABAP comum.
A classe global ou a interface global é então exibida na tabela Class Builder na área de editor
do Object Navigator.

160 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes globais

Definição de atributos em uma classe global

Figura 102: Definição de atributos

Selecione a ficha de registro Atributos para abrir uma lista de todas as definições de atributo
na classe. Você também pode definir novos atributos aqui.
Você pode utilizar as entradas possíveis ao definir os tipos de atributos. Não se esqueça de
utilizar descrições breves significativas.

© Direitos autorais. Todos os direitos reservados. 161


Capítulo 6 : Objetos do repositório orientados a objetos

Criar métodos na classe global

Figura 103: Definição de métodos

Selecione a ficha de registro Métodos para abrir uma lista de todas as definições de método
na classe. Você pode definir novos métodos aqui. Não se esqueça de utilizar descrições
breves significativas.
Existem janelas de editor separadas para os parâmetros de método (também conhecidos
como assinatura de método) e a implementação.

Selecione o botão Construtor para definir um construtor de instância. O sistema seleciona


automaticamente o nome do construtor.

Dica:
Os métodos podem ser transportados separadamente porque cada
implementação é arquivada em seu próprio include ABAP.

162 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes globais

Definição de parâmetros de método

Figura 104: Definição de assinaturas de método

Na lista de métodos, selecione um método e selecione o botão Parâmetro para ir para a


atualização da assinatura. Você pode definir novos parâmetros formais aqui. Você pode
utilizar as entradas possíveis ao definir o tipo dos parâmetros. Não se esqueça de utilizar
descrições breves significativas.
Você pode navegar entre as assinaturas com a ajuda do botão Método anterior ou Próximos
métodos. Selecione o botão Métodos para retornar à lista de métodos.

Implementação de métodos

Figura 105: Implementação de métodos

© Direitos autorais. Todos os direitos reservados. 163


Capítulo 6 : Objetos do repositório orientados a objetos

Na lista de métodos, selecione um método clicando duas vezes nele. Em alternativa,


selecione o botão Texto fonte para ir para a atualização do texto fonte se um método já
estiver selecionado. Você pode implementar os métodos aqui.

Dica:
Selecione o botão relevante para exibir a assinatura do método.

Exibição da definição de método

Figura 106: Exibição da definição de método

Selecione → GotoMethod definition para modificar os atributos de seu método durante a


implementação. Opcionalmente, você pode definir um método de manipulador de eventos na
ficha de registro Atributos na caixa de diálogo.

164 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes globais

Definição de componentes, utilizando a área de navegação

Figura 107: Definição de componentes, utilizando a área de navegação

Você pode definir atributos, métodos ou eventos no menu de contexto da área de navegação
do Object Navigator. As características são então atualizadas em uma caixa de diálogo e não
na tabela.

Dica:
Selecione → ClassPrint ou → MethodPrint para imprimir partes selecionadas do
texto fonte.

© Direitos autorais. Todos os direitos reservados. 165


Capítulo 6 : Objetos do repositório orientados a objetos

Ambiente de teste Class Builder

Figura 108: O ambiente de teste do Class Builder

Você pode testar classes globais ativas selecionando o caminho de menu → → ClassRunIn
Test Environment, selecionando o botão correspondente da barra de ferramentas da
aplicação ou pressionando F8.
Atributos estáticos e métodos estáticos podem ser acessados diretamente no ambiente de
teste. Atributos de instância e métodos de instância só podem ser acessados após a criação
da instância. Você pode criar uma instância utilizando o botão Criar instância.
O sistema apenas lista os componentes públicos. Os métodos podem ser testados utilizando
o botão Executar método.
Estas são as etapas para acionar eventos em uma classe:

1. Selecione um evento.

2. Selecione Manipulador para registrar um método padrão para o evento.

3. Chame um método no qual o acionador de eventos tenha sido implementado.

O evento acionado e todos os parâmetros reais exportados são exibidos em uma lista.

166 © Direitos autorais. Todos os direitos reservados.


Lição: Criação de classes globais

Utilização de classes globais no editor ABAP

Figura 109: Separação das áreas de navegação e de processamento no Object Navigator

Como outros objetos do repositório, classes globais e interfaces são adicionadas na área de
navegação do Object Navigator. Dessa forma, as vantagens discutidas também se aplicam a
classes e interfaces globais.

Instanciação de objetos utilizando arrastar e soltar

Figura 110: Instanciação de objetos utilizando arrastar e soltar

Na área de navegação, selecione um nome de classe e mova o mesmo para a área de


processamento. Esta ação cria uma instrução CREATE OBJECT. Em seguida, adicione a
variável de referência e os parâmetros reais, se aplicável, à instrução.

© Direitos autorais. Todos os direitos reservados. 167


Capítulo 6 : Objetos do repositório orientados a objetos

Como alternativa, você também pode selecionar o botão Modelo. Você pode encontrar a
instrução CREATE OBJECT selecionando Padrões de objetos ABAP. Você pode gerar a
instrução utilizando as Entradas possíveis.

Chamadas de método utilizando arrastar e soltar

Figura 111: Chamadas de método utilizando arrastar e soltar

Na área de navegação, selecione um nome de método e mova o mesmo para a área de


processamento. Esta ação cria uma instrução CREATE METHOD. Em seguida, adicione a
variável de referência e os parâmetros reais, se aplicável, à instrução.
Como alternativa, você também pode selecionar o botão Modelo. A instrução CALL METHOD
está em Padrão de objetos ABAP. Você pode gerar a instrução utilizando as Entradas
possíveis.

Nota:
Para gerar padrões, ative o estilo de escrita funcional moderno para chamadas de
método. Selecione Utilitários → → Configurações Modelo e marque o campo de
seleção Estilo de escrita funcional para método de chamada.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Criar classes globais
● Testar classes globais
● Utilizar classes globais

168 © Direitos autorais. Todos os direitos reservados.


Capítulo 6
Lição 2
Definição e implementação de interfaces
globais

SÍNTESE DA LIÇÃO
Esta lição explica como definir e implementar interfaces globais.

Exemplo de negócio
Como desenvolvedor, você precisa criar uma interface global para que outros
desenvolvedores na sua organização possam utilizar a mesma interface e implementá-la de
formas próprias em suas classes. Por esse motivo, você precisa:
● Compreensão de como definir e implementar interfaces globais
● Compreensão de como importar classes e interfaces locais

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir e implementar interfaces globais
● Importar classes e interfaces locais

© Direitos autorais. Todos os direitos reservados. 169


Capítulo 6 : Objetos do repositório orientados a objetos

Definição de interfaces globais

Figura 112: Definição de interfaces globais

Você cria interfaces globais da mesma forma que cria classes globais. Clique com o botão
direito do mouse no nome do programa na área da tela Nome do objeto e selecione
→ CreateClass. A convenção de nomes é IF_ para interfaces SAP e ZIF_ ou YIF_ para
interfaces definidas pelo usuário.

170 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e implementação de interfaces globais

Implementação de interfaces globais

Figura 113: Inclusão de interfaces globais

Se você quiser incluir uma interface global na sua classe global, deve inserir o nome da
interface na ficha de registro Interfaces.
Assim que você tiver efetuado isso, todos os componentes de interface aparecem
automaticamente nas fichas de registro relevantes de acordo com a convenção de nomes
com o operador de resolução de interface. No exemplo, é incorporada a interface global
ZIF_00_PARTNER que contém o método DISPLAY_PARTNER. Clique duas vezes no nome do
método para implementar o método.

© Direitos autorais. Todos os direitos reservados. 171


Capítulo 6 : Objetos do repositório orientados a objetos

Importação de classes e interfaces locais

Figura 114: Importação de uma classe de programa local

O procedimento a seguir é uma forma fácil de fazer cópias globais de classes locais e
interfaces locais.

Dica:
A função para copiar classes locais para classes globais não pode ser utilizada a
partir de OBJECT-NAVIGATOR.

Importar classes e interfaces locais

1. Na tela SAP Easy Access, selecione → Ferramentas ABAP


Workbench → → DevelopmentClass Builder ou chame a transação SE24.

2. Em Class Builder: Initial Screen, selecione Object type → → ImportLocal classes in


program.

3. Na caixa de diálogo Importar do programa, insira o nome do programa principal e, se as


classes e interfaces locais tiverem sido definidas em programas include, marque o campo
de seleção Expandir INCLUDEs.

4. Selecione o botão Exibir classes/interfaces.

5. Insira os nomes para as classes e interfaces globais que você quer criar.

6. Se aplicável, lembre-se do espaço de nomes de cliente.

7. Para selecionar todos os nomes globais, selecione o botão Selecionar tudo.

8. Selecione as classes e interfaces globais que você quer criar e selecione o botão Importar.

172 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e implementação de interfaces globais

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir e implementar interfaces globais
● Importar classes e interfaces locais

© Direitos autorais. Todos os direitos reservados. 173


Capítulo 6 : Objetos do repositório orientados a objetos

174 © Direitos autorais. Todos os direitos reservados.


Capítulo 6
Lição 3
Utilização de outras funções do Class Builder

SÍNTESE DA LIÇÃO
Esta lição explica como gerar diagramas UML utilizando herança em classes globais.

Exemplo de negócio
Como desenvolvedor, você precisa gerar diagramas UML, que ajudam você a manter uma
síntese sobre suas classes globais e suas relações entre si. Além disso, você precisa melhorar
a implementação de sua classe de hotel usando herança. Por esse motivo, você precisa:
● Compreensão de como gerar diagramas UML
● Compreensão de como lidar com classes globais
● Compreensão de como utilizar o assistente de refatoração

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Gerar diagramas UML para classes globais
● Implementar herança em classes globais
● Modificar a exibição de componentes em classes globais

© Direitos autorais. Todos os direitos reservados. 175


Capítulo 6 : Objetos do repositório orientados a objetos

Geração de diagramas UML para classes globais

Figura 115: Geração de um diagrama UML para pacote

No SAP NetWeaver 7.0 Enhancement Package 2 (EhP2), o Class Builder pode gerar
diagramas UML para a codificação existente. Esta função exibirá classes globais se você
selecionar um pacote para exibir. No entanto, se você selecionar um programa, as classes
locais e as interfaces globais serão exibidas, mas não as classes globais. No entanto, os
diagramas podem incluir objetos do ABAP Dictionary.
A figura mostra como iniciar a funcionalidade para um pacote completo. Em uma caixa de
diálogo, você pode adicionar uma seleção de objetos e indicar quais detalhes deseja ver no
diagrama.

176 © Direitos autorais. Todos os direitos reservados.


Lição: Utilização de outras funções do Class Builder

Herança em classes globais

Figura 116: Definição de uma relação de herança

Definir as relações de herança entre classes globais na ficha de registro Características.


Selecione o botão Classe superior para especificar uma classe superior. No exemplo
mostrado na figura Definição de uma relação de herança, a subclasse
ZCL_CARGO_PLANE_00 herda da classe superior ZCL_AIRPLANE_00.

© Direitos autorais. Todos os direitos reservados. 177


Capítulo 6 : Objetos do repositório orientados a objetos

Redefinição de um método na classe global

Figura 117: Redefinição de um método herdado

Para redefinir um método herdado, selecione o método relevante na lista e selecione o botão
Redefinir. Alternativamente, você pode utilizar o menu de contexto na área de navegação.

Nota:
A aparência de alguns dos botões ou menus depende do nível de liberação. O
botão para redefinir métodos é um exemplo.

Dica:
Para definir o construtor na subclasse, selecione o botão CONSTRUCTOR na
barra de ferramentas da aplicação. O sistema propõe então a transferência da
assinatura do construtor da classe superior. Isso é útil quando você quer criar o
construtor da subclasse. Você pode adicionar alguns parâmetros aqui. Da
mesma forma, você pode encontrar a chamada para a classe superior aqui.

178 © Direitos autorais. Todos os direitos reservados.


Lição: Utilização de outras funções do Class Builder

Tipos locais em classes globais

Figura 118: Definição de um tipo local

Você pode definir tipos locais em classes globais. Classes globais incluem classes locais.
Tecnicamente, você não está definindo uma classe dentro de uma classe, mas uma classe
que é local no objeto do repositório da classe global.
Todos os componentes da classe global têm acesso a esses tipos locais, mas são
encapsulados se você tentar acessá-los de fora.
O mesmo se aplica a interfaces locais em classes globais.
Existem dois includes de classe para a definição e implementação de classes locais, como se
segue:

1. Definições/implementações locais (anteriormente: Implementações de classe local):


Este include contém interfaces locais, definições de classe locais, tipos locais e
implementações de classe locais que não são utilizadas na seção privada da classe global
(por exemplo, para digitar um parâmetro de método).

2. Definições locais relevantes para classe (anteriormente: tipos locais)


Este include contém interfaces locais, definições de classe locais, tipos locais e
implementações de classe locais que são utilizadas na seção privada da classe global (por
exemplo, para digitar um parâmetro de método).

Os includes podem ser entrados mediante o menu → GotoLocal Definitions/


Implementations.

© Direitos autorais. Todos os direitos reservados. 179


Capítulo 6 : Objetos do repositório orientados a objetos

Exibição de componente de classe

Figura 119: Exibição estruturada de componentes herdados

Para melhorar o seu entendimento sobre herança e componentes de interface, você pode
definir o código Agrupar por classes e interfaces nas Configurações específicas do usuário
para o Class Builder. O sistema exibirá então os componentes da classe global em um grupo.

Ordenação da exibição de componentes de classes globais

Figura 120: Ordenação da exibição de componentes de classes globais

Você pode ordenar todos os componentes por cinco critérios em três níveis. Selecione o
botão Ordenar para exibir a caixa de diálogo apropriada.

180 © Direitos autorais. Todos os direitos reservados.


Lição: Utilização de outras funções do Class Builder

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Gerar diagramas UML para classes globais
● Implementar herança em classes globais
● Modificar a exibição de componentes em classes globais

© Direitos autorais. Todos os direitos reservados. 181


Capítulo 6 : Objetos do repositório orientados a objetos

182 © Direitos autorais. Todos os direitos reservados.


Capítulo 6

Avaliação da aprendizagem

1. Você só pode utilizar classes ou interfaces locais dentro do mesmo programa no qual elas
estão definidas e implementadas.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. A convenção de nomes para interfaces globais padrão da SAP é ZIF_ ou YIF_.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

3. Qual dos seguintes botões no Class Builder é utilizado para substituir um método
herdado?
Escolha a resposta correta.

X A CONSTRUCTOR

X B Redefinir

X C Implementação

4. Os tipos locais da classe global estão encapsulados e não podem ser acessados de fora.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 183


Capítulo 6

Avaliação da aprendizagem - Respostas

1. Você só pode utilizar classes ou interfaces locais dentro do mesmo programa no qual elas
estão definidas e implementadas.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Tal como com subprogramas, utilize classes locais ou interfaces locais
somente dentro do programa no qual estão definidas e implementadas. A instrução
CLASS é uma declaração local no programa. Saiba mais na tarefa Definição de classes
globais na lição Criação de classes globais do curso BC401.

2. A convenção de nomes para interfaces globais padrão da SAP é ZIF_ ou YIF_.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! A convenção de nomes é IF_ para interfaces globais SAP e ZIF_ ou YIF_
para interfaces globais definidas pelo usuário. Saiba mais na tarefa Definição de interfaces
globais na lição Definição e implementação de interfaces globais do curso BC401.

3. Qual dos seguintes botões no Class Builder é utilizado para substituir um método
herdado?
Escolha a resposta correta.

X A CONSTRUCTOR

X B Redefinir

X C Implementação

Você está correto! Para redefinir um método herdado, selecione o método relevante na
lista e selecione o botão Redefinir. Alternativamente, você pode utilizar o menu de
contexto na área de navegação. Saiba mais na tarefa Redefinição de um método na classe
global, na lição Implementação de herança em classes globais, no curso BC401.

184 © Direitos autorais. Todos os direitos reservados.


Capítulo 6 : Avaliação da aprendizagem - Respostas

4. Os tipos locais da classe global estão encapsulados e não podem ser acessados de fora.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Você pode definir tipos locais em classes globais. Todos os
componentes da classe global têm acesso a esses tipos locais, mas são encapsulados se
você tentar acessá-los de fora. O mesmo se aplica a interfaces locais em classes globais.
Leia mais na tarefa, Tipos locais em classes globais, na lição, implementando Herança em
classes globais, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 185


Capítulo 6 : Avaliação da aprendizagem - Respostas

186 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 7 Exemplos de programação
ABAP orientada a objetos

Lição 1
Utilizando o ABAP List Viewer (ALV) 189

Lição 2
Descrição de Business Add Ins (BAdIs) 197

OBJETIVOS DO CAPÍTULO

● Implementar um ALV Grid simples


● Processar o evento de clique duplo do ALV Grid
● Descrever BAdIs

© Direitos autorais. Todos os direitos reservados. 187


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

188 © Direitos autorais. Todos os direitos reservados.


Capítulo 7
Lição 1
Utilizando o ABAP List Viewer (ALV)

SÍNTESE DA LIÇÃO
Esta lição mostra como implementar o ABAP List Viewer (ALV).

Exemplo de negócio
Você precisa criar um relatório usando o ALV Grid Control. Por esse motivo, você precisa:
● Compreensão do ALV Grid Control
● Compreensão da utilização de um ALV em uma área da tela
● Compreensão de como implementar ALV
● Compreensão da implementação de um manipulador para o evento de clique duplo
● Saber como implementar um manipulador de eventos para o ALV Grid Control
● Compreensão de como implementar um popup com o ALV Grid Control

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar um ALV Grid simples
● Processar o evento de clique duplo do ALV Grid

© Direitos autorais. Todos os direitos reservados. 189


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

O ALV Grid Control

Figura 121: O ALV Grid Control

Os seguintes tópicos ilustram as possíveis áreas de aplicação da programação ABAP


orientada a objetos e a utilização de classes padrão da SAP. Por exemplo, o ALV Grid Control
no contexto do Control Framework e dos Business Add Ins (BAdIs).
O SAP Control Framework é um conjunto de classes e interfaces globais que você pode
utilizar para adicionar controles SAP GUI a seus programas ABAP Objects,
independentemente da plataforma.
O ALV Grid Control é uma ferramenta que você pode utilizar para exibir listas não
hierárquicas de uma forma padronizada. Os dados da lista são exibidos em tabelas. É fácil
trabalhar com a ferramenta, pois há pouquíssimas etapas de programação que devem ser
realizadas.
O ALV Grid Control contém uma série de funções padrão interativas que os usuários de listas
necessitam frequentemente, por exemplo, de impressão, exportação. Como desenvolvedor,
você pode optar por ocultar essas funções padrão. Se necessário, você pode adaptar as
implementações para atender às necessidades da sua aplicação. Você também pode
adicionar suas próprias funções à barra de ferramentas da aplicação.

190 © Direitos autorais. Todos os direitos reservados.


Lição: Utilizando o ABAP List Viewer (ALV)

Inclusão de uma instância ALV Grid Control em um programa de diálogo

Figura 122: Inclusão de uma instância ALV Grid Control em um programa de diálogo

Os controles de container fornecem a conexão técnica entre a tela e os controles de


aplicação. Os controles de aplicação ALV Grid Control, Tree Control e Picture Control estão
sempre integrados no Container Control, que está conectado à tela.
Existem diferentes tipos de controles de containers. No entanto, todos incorporam funções
de controle fundamentais, como barras de rolagem.

© Direitos autorais. Todos os direitos reservados. 191


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

Criação de um ALV

Figura 123: Exibição dos dados da aplicação usando uma instância de ALV Grid

Você deve colocar um ALV Grid Control em uma área de tela com um tamanho fixo. Para isso,
você deve criar uma instância de cada uma das classes globais
CL_GUI_CUSTOM_CONTAINER e CL_GUI_ALV_GRID.
Para a exibição normal, execute as seguintes etapas de programação:

1. Utilize o editor de tela inteira do Screen Painter para definir uma área de controle
personalizada na sua tela.

2. Crie uma instância da classe CL_GUI_CUSTOM_CONTAINER e transfira o nome da área


de controle personalizada para o construtor.

3. Crie uma instância da classe CL_GUI_GUI_ALV_GRID e transfira a referência à instância


de controle personalizada para o construtor.

4. Chame o método SET_TABLE_FOR_FIRST_DISPLAY da instância de grid control e


transfira para ele a tabela padrão interna que contém os dados a serem exibidos.

Se a tabela tiver uma categoria de linha global definida no ABAP Dictionary, você pode
transferir o nome desta estrutura global para o mesmo método. O ALV Grid Control cria o
catálogo de campos automaticamente

Cuidado:
A tabela interna transferida para o método SET_TABLE_FOR_FIRST_DISPLAY
deve estar definida globalmente. Por isso, a tabela deve ser uma variável de
programa global ou um atributo público de uma classe.

Quando você modifica o conteúdo das tabelas internas enquanto o programa está sendo
executado, você só precisa chamar o método REFRESH_TABLE_DISPLAY na etapa de diálogo
relevante para atualizar a exibição.

192 © Direitos autorais. Todos os direitos reservados.


Lição: Utilizando o ABAP List Viewer (ALV)

Implementação de um manipulador para o evento de clique duplo

Figura 124: ALV Grid Control – clique duplo

Um ALV Grid Control pode reagir ao clique duplo do usuário. Como reação possível, você
pode acionar uma etapa de processamento subsequente na qual são exibidas informações
adicionais.
No exemplo exibido na figura ALV Grid Control – clique duplo, os dados da reserva para os
clientes de voo individuais ou dados sobre a aeronave também podem ser exibidos para os
dados do voo. Isso é executado ao capturar o evento DOUBLE_CLICK com um método de
manipulador.

© Direitos autorais. Todos os direitos reservados. 193


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

ALV Grid Control – Reagindo a um clique duplo

Figura 125: ALV Grid Control – Reagindo a um clique duplo

Um método de manipulador é um método de classe (método estático) ou um método de


instância de um objeto. Se um método de classe for definido como método de manipulador,
nenhum objeto da classe manipulada precisa ser instanciado para usar o método.
Para criar um objeto manipulador para um evento, defina uma classe. Esta classe tem um
método público na seção pública que pode reagir a um evento. Durante a implementação do
método de manipulador, defina o texto fonte que deve ser executado quando o evento é
acionado. O método recebe a informação que o evento fornece da posição do mouse quando
você clica duas vezes e cria uma mensagem de informação no exemplo de controle que exibe
a linha e o campo do clique do mouse.

194 © Direitos autorais. Todos os direitos reservados.


Lição: Utilizando o ABAP List Viewer (ALV)

Nota:
A documentação abrangente sobre o SAP Control Framework está disponível na
documentação de produto padrão da SAP (fornecida com o produto ou online por
meio do SAP Help Portal). A biblioteca SAP contém descrições abrangentes de
todas as classes e um tutorial completo.
O ABAP Workbench também contém o Centro de demonstração Enjoy, que
facilita a utilização de programas-modelo padrão. Para encontrá-lo, utilize a
transação DWDM (demonstrações do workbench de desenvolvimento).
Elementos individuais do SAP Control Framework são abordados em outros
cursos.
A SAP também oferece um curso abrangente separado sobre programação em
diálogo com os controles da SAP. O curso abrange todos os aspectos, incluindo
técnicas de programação complexas, como as funções de arrastar e soltar.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar um ALV Grid simples
● Processar o evento de clique duplo do ALV Grid

© Direitos autorais. Todos os direitos reservados. 195


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

196 © Direitos autorais. Todos os direitos reservados.


Capítulo 7
Lição 2
Descrição de Business Add Ins (BAdIs)

SÍNTESE DA LIÇÃO
Esta lição mostra como implementar Business Add Ins (BAdIs).

Exemplo de negócio
Você precisa ampliar a funcionalidade em um programa padrão da SAP, sem alterar o
programa original. Isso pode ser feito usando BAdIs. Por esse motivo, você precisa:
● Compreensão de BAdIs
● Compreensão de como definir um BAdI
● Compreensão de como implementar um BAdI

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Descrever BAdIs

BAdIs
Ao contrário dos exits de cliente, os BAdIs são otimizados para o processo de entrega de
software modificado.
O processo típico de entrega de software não consiste apenas de fornecedores e clientes,
mas vários provedores intermediários podem estar envolvidos na cadeia de entrega de
software. Por exemplo, um parceiro da SAP pode ampliar um programa de aplicação da SAP
com uma solução setorial como a unidade de negócios industrial (IBU). O cliente pode, então,
ampliar novamente o mesmo programa.

© Direitos autorais. Todos os direitos reservados. 197


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

BAdI – Fundamentos

Figura 126: BAdI – Fundamentos

Com um BAdI, uma aplicação SAP fornece a opção de ampliação mediante uma interface e
uma classe de adaptador que implementa essa interface.
A interface pode ser implementada por vários usuários na cadeia de fornecimento, assim, são
possíveis várias implementações de BAdI. Além disso, uma implementação de BAdI pode
fornecer outro BAdI, que pode ser implementado por usuários que aparecem mais na cadeia
de fornecimento.

198 © Direitos autorais. Todos os direitos reservados.


Lição: Descrição de Business Add Ins (BAdIs)

Definição de um BAdI – Fundamentos

Figura 127: Definição de um BAdI – Fundamentos

Quando você define um BAdI, deve indicar uma interface (IF_EX_<badi>) com métodos
correspondentes definidos formalmente. A classe de adaptador gerada automaticamente
durante a definição de interface (CL_EX_<badi>) tem, entre outras funções, a função de
chamar todas as implementações ativas do BAdI. Quando você tem várias implementações
ativas, não existe nenhuma sequência de processamento predefinida.

Como analisar uma definição de BAdI

1. Execute a transação SE18 ou, na tela SAP Easy Access, selecione Ferramentas → ABAP
→ WorkbenchUtilitários → Business Add Ins → Definição.

2. Selecione a opção Nome do BAdI.

3. Insira BADI_BC401 no campo de entrada após o nome do BAdI e selecione Exibir.

4. Analise as configurações na ficha de registro Características, em particular a opção


Utilização múltipla.

5. Analise as configurações na ficha de registro Interface, em especial o nome da interface


(IF_EX_BADI_BC401) e o nome do método de interface (ENHANCE_LIST).

6. Clique duas vezes no nome da interface para navegar para a definição da interface.

7. Clique no nome da interface e selecione Utilização da classe/interface para exibir a Lista


de utilizações para a interface. (Selecione Executar e Sim nas duas janelas de diálogo
seguintes). Você deve encontrar três utilizações da interface:

© Direitos autorais. Todos os direitos reservados. 199


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

● Classe CL_EX_BADI_BC401 (a classe de adaptador desta definição de BAdI)

● Classe CL_IM_BC401_IMPL (a classe de implementação de uma implementação de


demonstração)

● Programa SAPBC401_BAD_D1 (o programa de chamada para esta definição de BAdI)

8. Clique duas vezes em Demo BAdI call para navegar para o texto fonte do programa
SAPBC401_BAD_D1.

9. Exiba a definição da variável de referência gb_badi_bc401, a chamada do método


GET_INSTANCE da classe CL_EXITHANDLER e a chamada do método ENHANCE_LIST do
BAdI.

10. Execute o programa e demonstre que nenhum texto adicional é visível no fim da lista.

O BAdI Programa de chamada

Figura 128: BAdI – O programa de chamada

A figura BAdI – O programa de chamada mostra um exemplo de uma chamada de BAdI.


É necessário definir uma variável de referência para o tipo de BAdI.
Um objeto da classe de adaptador é instanciado pela chamada do método estático
GET_INSTANCE da classe CL_EXITHANDLER. A variável gb_adapter aponta para esta
instância.
Os métodos de interface do BAdI podem ser chamados pela referência ao objeto gb_adapter.

A pesquisa de BAdIs
Você pode procurar o BAdI utilizando as seguintes estratégias:

200 © Direitos autorais. Todos os direitos reservados.


Lição: Descrição de Business Add Ins (BAdIs)

● Você pode utilizar o sistema de informação do repositório (transação SE84).

● Você pode utilizar a hierarquia de aplicação (transação SE81).

● Você pode utilizar o guia de customizing (guia de implementação para a transação SPRO).

● Você pode procurar a instrução CL_EXITHANDLER=>GET_INSTANCE no texto fonte da


aplicação.
● Você pode procurar, no texto fonte da aplicação, a ocorrência das interfaces BAdI com a
convenção de nomes IF_EX_.
● A partir do SAP Netweaver AS 7.0, você pode procurar no texto fonte da aplicação as
ocorrências da instrução GET BADI.

O nome do BAdl deve ser investigado antes de você poder implementar o BAdI. Ao procurar
nomes de BAdI, você pode utilizar os mecanismos de pesquisa. Clique duas vezes na variável
de referência (gb_adapter) no exemplo para obter a definição da interface. Você pode derivar
o nome do BAdI a partir do nome da interface.

Nota:
Como procurar no texto fonte ABAP:
Ao executar uma transação arbitrária, pressione a tecla F1. Na caixa de diálogo
exibida, selecione o botão Informações técnicas. Navegue para o texto fonte do
programa clicando duas vezes no nome do programa. Em seguida, chame a
função de pesquisa global no menu Edit → Find Next e pesquise a cadeia
desejada.
Não utilize a função de pesquisa do editor Processar → Procurar/substituir (Ctrl +
F), pois esta função irá considerar somente um único include de texto fonte.

© Direitos autorais. Todos os direitos reservados. 201


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

Implementação de BAdI

Figura 129: Implementação de um BAdI – SE19

Quando o nome do BAdI é determinado, o BAdI pode ser implementado. A implementação do


BAdI é realizada por meio da atualização da implementação em Ferramentas → ABAP
Workbench → Utilitários → Business Add-Ins → Implementação (código de transação SE19).
Em alternativa, você pode ir para as implementações navegando no menu a partir da
definição de BAdI.
Para implementar um BAdI, deve ser emitido um nome de implementação de BAdI. A
convenção de nomes é Z<impl>. Em seguida, é exibida uma caixa de diálogo para selecionar o
BAdI correspondente.
O código a ser implementado é armazenado em um método de uma classe de cliente gerada
automaticamente. Por este motivo, o nome da classe de implementação deve ser indicado
em uma caixa de diálogo final. O nome padrão da SAP é composto por Y ou Z (o prefixo do
espaço de nomes), CL_ (para classe), IM_ (para implementação) e <impl> (o nome real da
implementação).
Ao clicar duas vezes em um dos métodos BAdI, você pode inserir o código do método. Você
também pode criar métodos auxiliares na classe de implementação para estruturar melhor o
código necessário do método BAdI.

Nota:
Ative os métodos das implementações no fim da tarefa.

202 © Direitos autorais. Todos os direitos reservados.


Lição: Descrição de Business Add Ins (BAdIs)

Como implementar um BAdI

1. Execute o código de transação SE19.

2. Em Criar implementação, selecione BAdI clássico.

3. Insira o nome do BAdI BADI_BC401 e selecione o botão Criar.

4. Insira um nome de implementação (nome proposto: ZBC401_00_IMPL) e selecione o


botão OK.

5. Insira um texto descritivo e selecione o botão Gravar.

6. Clique duas vezes no nome da classe de implementação para navegar para a classe e
implementar seu texto fonte aí (é suficiente implementarWRITE 'Hello World' a
instrução no método ENHANCE_LIST.)

7. Ative sua classe de implementação.

8. Execute o programa SAPBC401_BAD_D1 e demonstre que a implementação de BAdI


ainda não foi executada.

9. Retorne à implementação de BAdI (SE19) e selecione Ativar implementação de Business


Add In.

10. Execute o programa SAPBC401_BAD_D1 e demonstre que agora a codificação adicional é


executada.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Descrever BAdIs

© Direitos autorais. Todos os direitos reservados. 203


Capítulo 7 : Exemplos de programação ABAP orientada a objetos

204 © Direitos autorais. Todos os direitos reservados.


Capítulo 7

Avaliação da aprendizagem

1. O ABAP List Viewer (ALV) Grid Control é uma ferramenta que você pode utilizar para
exibir listas não hierárquicas de forma padronizada.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. Os controles de container fornecem a conexão técnica entre a tela e o controle da


aplicação.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

3. Para criar um objeto manipulador para um evento, é necessário definir primeiro um


____________.
Escolha a resposta correta.

X A classe

X B estrutura

X C tela

X D atributo

4. Um método de manipulador pode ser um método de classe (método estático) ou um


método de instância de um objeto.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 205


Capítulo 7 : Avaliação da aprendizagem

5. Com um Business Add In (BAdI), um programa de aplicação da SAP fornece a opção de


ampliação por meio de um método de interface.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

6. Um objeto da classe de adaptador BAdI é instanciado pela chamada do método estático


GET_INSTANCE da classe CL_EXITHANDLER.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

7. Para implementar um Business Add In (BAdI), é necessário determinar o nome da


definição BAdI.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

8. O código de uma implementação de BAdI é armazenado em um __________ de uma classe


de cliente gerada automaticamente.
Escolha a resposta correta.

X A método

X B estrutura

X C objeto

206 © Direitos autorais. Todos os direitos reservados.


Capítulo 7

Avaliação da aprendizagem - Respostas

1. O ABAP List Viewer (ALV) Grid Control é uma ferramenta que você pode utilizar para
exibir listas não hierárquicas de forma padronizada.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O ALV Grid Control é uma ferramenta que você pode utilizar para exibir
listas não hierárquicas de uma forma padronizada. Saiba mais na tarefa, O ALV Grid
Control, na lição Utilização do ABAP List Viewer (ALV), no curso BC401.

2. Os controles de container fornecem a conexão técnica entre a tela e o controle da


aplicação.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Os controles de container fornecem a conexão técnica entre a tela e os
controles de aplicação. Os controles de aplicação ALV Grid Control, Tree Control e Picture
Control estão sempre integrados no Container Control, que está conectado à tela. Saiba
mais na tarefa, Incluindo uma instância do ALV Grid Control em um programa de diálogo,
na lição Utilização do ABAP List Viewer (ALV), no curso BC401.

3. Para criar um objeto manipulador para um evento, é necessário definir primeiro um


____________.
Escolha a resposta correta.

X A classe

X B estrutura

X C tela

X D atributo

Você está correto! Para criar um objeto manipulador para um evento, defina uma classe.
Saiba mais na tarefa, ALV Grid Control – Reagindo a um clique duplo, na lição Utilização
do ABAP List Viewer (ALV), no curso BC401.

© Direitos autorais. Todos os direitos reservados. 207


Capítulo 7 : Avaliação da aprendizagem - Respostas

4. Um método de manipulador pode ser um método de classe (método estático) ou um


método de instância de um objeto.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Um método de manipulador é um método de classe (método estático)


ou um método de instância de um objeto. Se um método de classe for definido como
método de manipulador, nenhum objeto da classe manipulada precisa ser instanciado
para usar o método. Saiba mais na tarefa, ALV Grid Control – Reagindo a um clique duplo,
na lição Utilização do ABAP List Viewer (ALV), no curso BC401.

5. Com um Business Add In (BAdI), um programa de aplicação da SAP fornece a opção de


ampliação por meio de um método de interface.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Com um BAdI, uma aplicação SAP fornece a opção de ampliação
mediante uma interface e uma classe de adaptador que implementa essa interface. A
interface pode ser implementada por vários usuários na cadeia de fornecimento, assim,
são possíveis várias implementações de BAdI. Saiba mais nesta lição, Descrição de
Business Add-Ins (BAdIs), Descrição de Business Add-Ins (BAdIs), Tarefa BAdI –
Fundamentos do curso, BC401.

6. Um objeto da classe de adaptador BAdI é instanciado pela chamada do método estático


GET_INSTANCE da classe CL_EXITHANDLER.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Um objeto da classe de adaptador é instanciado pela chamada do


método estático GET_INSTANCE da classe CL_EXITHANDLER. Saiba mais nesta lição,
Descrição de Business Add-Ins (BAdIs), Tarefa Programa de chamada de BAdI, do curso
BC401.

208 © Direitos autorais. Todos os direitos reservados.


Capítulo 7 : Avaliação da aprendizagem - Respostas

7. Para implementar um Business Add In (BAdI), é necessário determinar o nome da


definição BAdI.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O nome do BAdl deve ser investigado antes de você poder
implementar o BAdI. Quando o nome do BAdI é determinado, o BAdI pode ser
implementado. Saiba mais nesta lição, Descrição de Business Add-Ins (BAdIs), tarefa
Implementação de BAdI, do curso BC401.

8. O código de uma implementação de BAdI é armazenado em um __________ de uma classe


de cliente gerada automaticamente.
Escolha a resposta correta.

X A método

X B estrutura

X C objeto

Você está correto! O código de uma implementação de BAdI é armazenado no método de


uma classe de cliente gerada automaticamente. Saiba mais nesta lição, Descrição de
Business Add-Ins (BAdIs), tarefa Implementação de BAdI, do curso BC401.

© Direitos autorais. Todos os direitos reservados. 209


Capítulo 7 : Avaliação da aprendizagem - Respostas

210 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 8 Classes globais em ferramentas
de desenvolvimento ABAP

Lição 1
Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse 213

OBJETIVOS DO CAPÍTULO

● Desenvolver codificação ABAP em Eclipse


● Usar soluções rápidas e refatoração

© Direitos autorais. Todos os direitos reservados. 211


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

212 © Direitos autorais. Todos os direitos reservados.


Capítulo 8
Lição 1
Desenvolvimento de programas ABAP com
ferramentas baseadas em Eclipse

SÍNTESE DA LIÇÃO
Esta lição explica como utilizar as ferramentas de desenvolvimento ABAP (ADT). O ADT é
baseado no framework do Eclipse.
O ADT oferece funções que não estão disponíveis no ABAP Workbench. Essas funções são
especialmente úteis ao escrever código orientado a objetos.

Exemplo de negócio
Você ouviu que a SAP oferece a possibilidade de desenvolvimento ABAP no Eclipse e que o
desenvolvimento do ABAP no Eclipse é particularmente útil para escrever código orientado a
objetos. Por isso, você quer saber mais sobre essa possibilidade.

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Desenvolver codificação ABAP em Eclipse
● Usar soluções rápidas e refatoração

Ferramentas de desenvolvimento ABAP


As ferramentas de desenvolvimento ABAP (ADT) são uma alternativa para o ABAP
Workbench. O ADT oferece os seguintes recursos:
● Uma experiência de desenvolvimento ABAP no topo da plataforma Eclipse.
● Uma plataforma aberta para o desenvolvimento de novas ferramentas relacionadas ao
ABAP.
● Um conjunto de APIs abertas, independentes do idioma e independentes da plataforma
que os desenvolvedores podem utilizar para criar novas ferramentas personalizadas para
o ambiente ABAP.

© Direitos autorais. Todos os direitos reservados. 213


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

Figura 130: Desenvolvimento ABAP baseado em Eclipse de ferramentas de desenvolvimento

A perspectiva ABAP
O Eclipse permite o desenvolvimento em muitas linguagens de programação diferentes. Para
suportar diferentes tipos de desenvolvimento, o Eclipse contém diferentes combinações de
ferramentas, chamadas Perspectivas. Se você tiver o ADT instalado, poderá mudar para a
perspectiva ABAP. Selecione → WindowOpen PerspectiveOther → ... → ABAP na barra de
menu ou selecione o botão Open Perspective.

Figura 131: Mudar para a perspectiva ABAP

214 © Direitos autorais. Todos os direitos reservados.


Lição: Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse

Criação de um projeto ABAP

Figura 132: Guia de introdução do ADT para criação de um projeto

Quando você utiliza o ADT, efetua login em um sistema back-end do SAP e trabalha
diretamente com seus objetos do repositório. Por isso, o processo de desenvolvimento é
exatamente o mesmo que quando você utiliza o ABAP Workbench, não é efetuado o check out
e o check in dos objetos.
Um projeto ABAP serve como um container para os objetos de desenvolvimento que são
armazenados em um sistema back-end ABAP específico e contém os parâmetros de login
para o logon no sistema — Sistema, Mandante, Usuário e idioma. Você deve estar conectado
ao sistema para processar um objeto. Dentro do ABAP projeto, você pode acessar qualquer
objeto de desenvolvimento no repositório. Além disso, para facilitar o gerenciamento de
objetos, você pode configurar pacotes favoritos para cada projeto.

© Direitos autorais. Todos os direitos reservados. 215


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

Processamento de objeto

Figura 133: ADT Editando objetos do repositório

O Explorador de projetos fornece uma visão hierárquica do repositório, semelhante à área de


navegação do ABAP Workbench. Em cada projeto, você pode atualizar uma lista de pacotes
favoritos. Expandindo o nó Biblioteca de sistema, você verá uma lista de todos os pacotes.
Para abrir um objeto do repositório específico em seu respectivo editor, clique duas vezes
nele. O editor é mostrado no lado direito da perspectiva ABAP. Para cada objeto novo, uma
nova guia é adicionada. Isso simplifica a navegação entre editores e objetos.

216 © Direitos autorais. Todos os direitos reservados.


Lição: Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse

Tipos de editores

Figura 134: Editores nativos ou editores SAP GUI integrados

Existem dois tipos de editores no ADT – há uma implementação nativa do Eclipse e uma
implementação baseada no SAP GUI. Na imagem, editores nativos e editores SAP GUI
integrados, você pode ver um exemplo de cada um dos seguintes tipos:
Há dois tipos de editores nas ferramentas de desenvolvimento ABAP:
● Editores para os quais há uma implementação nativa do Eclipse
Por exemplo, editor ABAP, um editor Eclipse
● Editores que são exibidos em uma SAP Graphical User Interface (GUI) integrada.
Por exemplo, o editor de transações ABAP com a visualização clássica da SAP GUI que
aparece no ambiente Eclipse

Não há necessidade de utilizar o ADT para o desenvolvimento ABAP e cada desenvolvedor é


livre para escolher se deseja utilizar o ADT ou o ABAP Workbench clássico. As funções e
funcionalidades do Eclipse e do ADT se prestam particularmente bem à programação
orientada a objetos, entre essas funcionalidades estão várias funções integradas de
refatoração e suporte para teste funcional. Há outras tarefas para as quais o ABAP
Workbench é mais adequado — em particular, ao trabalhar com pools de módulos e telas.

Documentação, instalação e suporte para ferramentas de desenvolvimento ABAP


Se você estiver procurando por uma instalação local do ADT, poderá escolher entre as
seguintes fontes:

● Centro de download de software licenciado pela SAP (http://service.sap.com/swdc),


parte do SAP Service Marketplace.

© Direitos autorais. Todos os direitos reservados. 217


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

● Site da web das ferramentas de desenvolvimento SAP para Eclipse (http://


tools.hana.ondemand.com). Você também pode encontrar outros produtos, como o SAP
HANA Studio ou as ferramentas de desenvolvimento do SAP UI5 neste site.
● Páginas do SAP Community Network (http://scn.sap.com/community/abap/eclipse e
http://scn.sap.com/community/abap/hana). Elas fornecem documentação e suporte
sobre como instalar as ferramenta de desenvolvimento SAP para Eclipse.

Correções rápidas
Desenvolvedores são frequentemente obrigados a reestruturar o código-fonte para facilitar o
entendimento, ampliá-lo e também torná-lo mais eficiente. No entanto, as consequências da
reestruturação podem levar à quebra de dependências. A refatoração elimina a necessidade
de edição tediosa que, de outra forma, é necessária para corrigir tais problemas de
reestruturação.

Síntese de opções de refatoração

● Correções rápidas
- adicionar implementação em falta (para classe completa ou método individual)
- gerar método (por exemplo, construtor de instância ou método setter/getter para um
atributo)
- Modificar visibilidade (por exemplo, transformar variável local em atributo, tornar o
componente privado público)
- renomear componente ( atributo, método, variável, interface)
● Extrair um método
● Excluir todas as variáveis não usadas

No Eclipse, Quick Fixes são atalhos para concluir tarefas ou resolver erros propostos
automaticamente pelo editor. O editor de classes no ADT fornece correções rápidas para
tarefas de editor comuns.

218 © Direitos autorais. Todos os direitos reservados.


Lição: Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse

Figura 135: Exemplo de uma solução rápida

A combinação de teclas CTRL + 1 exibe as soluções rápidas disponíveis em uma caixa de


diálogo. Para uma classe, estas são as seguintes:
● Crie a parte de implementação em falta da classe.
● Criar implementações de método ainda em falta (por exemplo, todos os métodos de uma
interface).
● Gere um construtor de instância.
● Gere um método factory (consulte mais sobre métodos factory posteriormente neste
curso).
● Adicionar documentação de classe

© Direitos autorais. Todos os direitos reservados. 219


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

Figura 136: Exemplo de soluções rápidas para um atributo

Para um atributo, as soluções rápidas disponíveis são as seguintes:


● Renomear o atributo
● Gerar método Getter e/ou Setter
● Modificar visibilidade

Extração de método
Uma importante técnica de refatoração é a extração de métodos. Isso envolve mover um
bloco de código para um novo método e substituir o bloco por uma chamada para esse novo
método. Para executar a extração do método, você deve estar processando uma classe ABAP
global ou local em um pool de classes, um programa ou outro tipo de programa ABAP. Seu
código não pode conter erros de sintaxe antes de começar. Considere que a extração de
métodos não é suportada em código fora de classes e que você só pode extrair um método
dentro da área de início e de fim de outro método.

220 © Direitos autorais. Todos os direitos reservados.


Lição: Desenvolvimento de programas ABAP com ferramentas baseadas em Eclipse

Figura 137: Extraindo um método: antes

A figura Extraindo um método: antes mostra dois métodos da mesma classe. Ambos
necessitam da mesma verificação de existência, embora o processamento seguinte seja
diferente.

Extraindo um método: após


Para aumentar a reutilização da codificação, você deseja criar um método privado com a
verificação de existência, como mostrado na figura Extraindo um método: depois.

Figura 138: Extraindo um método: após

© Direitos autorais. Todos os direitos reservados. 221


Capítulo 8 : Classes globais em ferramentas de desenvolvimento ABAP

O ADT suporta a criação do método CHECK_EXISTENCE e sua chamada em um dos métodos


originais utilizando a função Extrair método.

Eliminação de variáveis não utilizadas


Outra técnica chave de refatoração é a exclusão das variáveis não utilizadas que podem se
acumular no código ao longo do tempo. Por exemplo, talvez você não precise mais do código
associado a uma variável e excluiu o código, mas não a variável, ou pode ter extraído um
método, deixando para trás declarações de dados que estão fora do escopo do código
extraído.

Modificações no nome da entidade de texto fonte


Na programação orientada a objetos, às vezes é necessário renomear classes, interfaces ou
qualquer um dos seus componentes. Ajustar as linhas de codificação que referenciam a
entidade então se torna um processo cansativo e demorado, particularmente se a entidade é
globalmente visível e frequentemente reutilizada. O ADT permite renomear a entidade e
ajustar todos os objetos que a utilizam.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Desenvolver codificação ABAP em Eclipse
● Usar soluções rápidas e refatoração

222 © Direitos autorais. Todos os direitos reservados.


Capítulo 8

Avaliação da aprendizagem

1. Ao trabalhar com ADT, você efetua o logon no sistema back-end ABAP e permanece
conectado durante toda a sua sessão.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. O ADT contém editores nativos do Eclipse para quais tipos de objetos do repositório?
Escolha as respostas corretas.

X A Programas ABAP

X B Elementos de dados

X C Classes ABAP

X D Pacotes

X E Elementos de texto

3. Você está criando uma classe ABAP no ADT e acabou de escrever a definição de um
método na seção pública da definição de classe. Pressione CTRL + 1 para ver as soluções
rápidas disponíveis. Quais das seguintes soluções rápidas estão disponíveis?
Escolha as respostas corretas.

X A Adicionar a implementação do método

X B Mover a definição de método para a seção protegida ou privada

X C Eliminar o método

© Direitos autorais. Todos os direitos reservados. 223


Capítulo 8

Avaliação da aprendizagem - Respostas

1. Ao trabalhar com ADT, você efetua o logon no sistema back-end ABAP e permanece
conectado durante toda a sua sessão.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Quando você utiliza o ADT, efetua login em um sistema back-end do
SAP e trabalha diretamente com seus objetos do repositório. Por isso, o processo de
desenvolvimento é o mesmo que quando você utiliza o ABAP Workbench, não é efetuado
o check out e o check in dos objetos. Saiba mais na tarefa Criação de um projeto ABAP na
lição Desenvolvimento de programas ABAP baseados em Eclipse, no curso BC401.

2. O ADT contém editores nativos do Eclipse para quais tipos de objetos do repositório?
Escolha as respostas corretas.

X A Programas ABAP

X B Elementos de dados

X C Classes ABAP

X D Pacotes

X E Elementos de texto

Você está correto! Existem dois tipos de editores nas ferramentas de desenvolvimento
ABAP: Editores para os quais existe uma implementação nativa do Eclipse por exemplo,
editor ABAP, um editor Eclipse, para editar relatórios ABAP ou classes ABAP Editores que
são exibidos em uma interface gráfica do usuário (GUI) da SAP, por exemplo, editor de
transação ABAP com a visualização SAP GUI clássica aparecendo no ambiente Eclipse.
Leia mais na tarefa, Tipos de tarefa de editores, na lição Desenvolvimento de programas
ABAP baseados em Eclipse, no curso BC401.

224 © Direitos autorais. Todos os direitos reservados.


Capítulo 8 : Avaliação da aprendizagem - Respostas

3. Você está criando uma classe ABAP no ADT e acabou de escrever a definição de um
método na seção pública da definição de classe. Pressione CTRL + 1 para ver as soluções
rápidas disponíveis. Quais das seguintes soluções rápidas estão disponíveis?
Escolha as respostas corretas.

X A Adicionar a implementação do método

X B Mover a definição de método para a seção protegida ou privada

X C Eliminar o método

Você está correto! Correções rápidas (por exemplo, adicionar implementações de


método em falta), Extração de método, Eliminação de variáveis não utilizadas,
Renomeação (por exemplo, renomear um atributo, um método, uma variável, uma
interface), Modificação da visibilidade (por exemplo, transformar variáveis locais em
atributos, tornar os componentes privados públicos). Saiba mais na tarefa, Fixes rápidos,
na lição Desenvolvimento de programas ABAP baseados em Eclipse, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 225


Capítulo 8 : Avaliação da aprendizagem - Respostas

226 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 9 Exceções baseadas na classe

Lição 1
Explicação de exceções baseadas na classe 229

Lição 2
Definição e geração de exceções 237

Lição 3
Implementar técnicas avançadas de tratamento de exceções 247

OBJETIVOS DO CAPÍTULO

● Explicar exceções baseadas na classe


● Tratar exceções baseadas na classe
● Depurar exceções baseadas na classe
● Definir classes de exceção globais
● Criar exceções baseadas na classe
● Propagar exceções
● Explicar a hierarquia de classes de exceção predefinidas
● Explicar as diferentes formas de tratamento de uma exceção
● Repetir após exceções
● Implementar exceções retomáveis
● Mapear exceções

© Direitos autorais. Todos os direitos reservados. 227


Capítulo 9 : Exceções baseadas na classe

228 © Direitos autorais. Todos os direitos reservados.


Capítulo 9
Lição 1
Explicação de exceções baseadas na classe

SÍNTESE DA LIÇÃO
Esta lição explica como tratar e depurar exceções baseadas na classe.

Exemplo de negócio
Você deve utilizar o novo conceito de exceções em seus programas ABAP Object. Por esse
motivo, você precisa:
● Compreender as exceções baseadas na classe
● Compreensão de como tratar exceções baseadas na classe
● Compreensão de como depurar exceções baseadas na classe

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar exceções baseadas na classe
● Tratar exceções baseadas na classe
● Depurar exceções baseadas na classe

Exceções baseadas na classe


Uma exceção é uma situação que ocorre durante a execução de um programa, durante a qual
não faz sentido continuar a execução normal do programa. O SAP NetWeaver Application
Server (SAP NetWeaver AS) S 6.10 introduziu um novo conceito de exceção do ABAP Objects
que existe paralelamente ao conceito existente baseado em sy-subrc. As exceções e o
tratamento de exceções baseiam-se agora nas classes. Este novo conceito de exceção do
ABAP Objects aprimorou a maneira clássica de tratar a exceção usando sy-subrc.

Dica:
Observe que a utilização de exceções baseadas na classe não se limita a
contextos orientados a objetos. As exceções baseadas na classe podem ser
criadas e tratadas em todos os blocos de processamento. Em particular, todos
os erros em tempo de execução anteriormente interceptáveis podem ser
tratados como exceções baseadas na classe.

© Direitos autorais. Todos os direitos reservados. 229


Capítulo 9 : Exceções baseadas na classe

Figura 139: Uma visão geral do conceito de exceção baseada na classe

No novo conceito de exceção, uma exceção é representada por um objeto de exceção. O


objeto de exceção é uma instância de uma classe de exceção. Os valores de atributo do
objeto de exceção contêm informações sobre a situação de erro respectiva. Criar uma
exceção baseada na classe significa instanciar uma classe de exceção e definir os atributos. O
tratamento de uma exceção baseada na classe envolve a avaliação do objeto de exceção e
seus valores de atributo.
As exceções baseadas na classe são criadas pela instrução RAISE EXCEPTION ou pelo
ambiente de tempo de execução. Você intercepta e trata exceções baseadas na classe com a
estrutura TRY...CATCH...ENDTRY.

230 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação de exceções baseadas na classe

Hierarquia de classes de exceção

Figura 140: Classes de exceção – A hierarquia de herança

Você pode definir suas próprias classes de exceção, mas o sistema já inclui uma série de
classes de exceção predefinidas – especialmente para exceções no ambiente de tempo de
execução. Você pode criar classes de exceção globalmente no Class Builder, mas também
pode definir classes de exceção locais dentro de um programa ou classe global.
Os nomes das classes de exceção globais sempre começam com <namespace>CX_. As
classes de exceção globais utilizadas pelo ambiente de tempo de execução começam com
CX_SY_. Recomendamos que você inicie os nomes das classes de exceção locais com LCX_.
Todas as classes de exceção são derivadas de uma classe de exceção, CX_ROOT. Por isso,
você pode acessar genericamente qualquer objeto de exceção por meio de uma variável de
referência, REF TO CX_ROOT.
No entanto, uma nova classe de exceção não pode herdar diretamente de CX_ROOT, derivar
qualquer classe de exceção nova direta ou indiretamente de uma das subclasses CX_ROOT -
CX_NO_CHECK, CX_DYNAMIC_CHECK ou CX_STATIC_CHECK.
Por meio disso, todas as classes de exceção são subdivididas em três grupos. Dependendo
do grupo ao qual uma determinada exceção pertence, a exceção é tratada de forma diferente
pela verificação de sintaxe e pelo ambiente de tempo de execução. O grupo padrão é
CX_STATIC_CHECK, que assegura máxima estabilidade do programa e da verificação de
sintaxe. Utilize os outros grupos somente em casos especiais.
O método GET_SOURCE_POSITION devolve o nome do programa principal ou programa
include e o número da linha no texto fonte onde ocorre a exceção. O método GET_TEXT
devolve um texto de exceção sob a forma de uma cadeia. Este método não está definido
diretamente em CX-ROOT, mas sim na interface IF_MESSAGE, que é implementada por CX-
ROOT.

© Direitos autorais. Todos os direitos reservados. 231


Capítulo 9 : Exceções baseadas na classe

Tratamento de exceções baseadas na classe

Figura 141: Estrutura de um bloco TRY-ENDTRY

Você pode tratar uma exceção se a instrução que acionou a mesma estiver dentro de uma
estrutura de controle TRY-ENDTRY. Você trata a exceção utilizando a instrução CATCH na
estrutura TRY-ENDTRY.
O bloco TRY contém as instruções para as quais as exceções precisam ser tratadas. Um
bloco CATCH contém o manipulador de exceções, que é executado se tiver ocorrido uma
exceção especificada no bloco TRY associado.
Como todas as estruturas de controle em ABAP Objects, você pode aninhar estruturas TRY-
ENDTRY em qualquer nível. Em particular, o bloco TRY, o bloco CATCH e o bloco CLEANUP
podem conter estruturas TRY-ENDTRY completas.
Indique qualquer número de classes de exceção na instrução CATCH. Assim, você define um
manipulador de exceções para todas essas classes de exceção e suas subclasses.
Se ocorrer uma exceção, o sistema procura uma instrução CATCH correspondente na
estrutura TRY-ENDTRY que envolve imediatamente a instrução. Ele procura nos blocos
CATCH a classe de exceção relevante ou as classes superiores da hierarquia de herança. Se
for encontrada uma das classes de exceção relevantes, o programa navega diretamente para
o manipulador.
Se o sistema não encontrar uma instrução CATCH correspondente, ele pesquisará
gradualmente as estruturas TRY-ENDTRY adjacentes. Se não for possível encontrar nenhum
manipulador no mesmo procedimento, o sistema tenta propagar a exceção para o programa
de chamada. Este processo será discutido mais detalhadamente mais adiante.
Se uma estrutura TRY-ENDTRY contiver um bloco CLEANUP, este bloco é executado quando
a estrutura TRY-ENDTRY é encerrada porque o sistema não consegue encontrar um
manipulador dentro da própria estrutura TRY-ENDTRY, mas sim em uma estrutura TRY-
ENDTRY circundante ou em um programa de chamada.

232 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação de exceções baseadas na classe

Sintaxe de exemplo para o tratamento de exceções predefinidas

Figura 142: Sintaxe de exemplo para o tratamento de exceções predefinidas

A figura, Exemplo de sintaxe para o tratamento de exceções predefinidas, mostra um


exemplo de sintaxe para o tratamento de exceções predefinidas.
Para analisar o objeto de exceção em um manipulador de exceções, use a instrução CATCH
no formulário CATCH ... INTO ... Você deve indicar uma referência de objeto tipificada
adequadamente após o suplemento opcional INTO. A referência pode ser uma referência à
própria classe de exceção ou a qualquer uma de suas classes superiores. Pouco antes de o
sistema executar o bloco CATCH, o sistema preenche a variável de referência para que
aponte para o objeto de exceção que descreve a situação de erro atual.
Se o intervalo de valores para o tipo de dados I for excedido no cálculo, o sistema de tempo de
execução cria a exceção CX_SY_ARITHMETIC_OVERFLOW. Essa exceção é tratada no bloco
CATCH implementado. A referência à instância correspondente é gravada no objeto de dados
GO_EXC no exemplo. O manipulador pode acessar o texto de exceção da instância utilizando
o método funcional GET_TEXT. O texto de exceção é armazenado no objeto de dados
GV_TEXT com o tipo STRING e depois exibido como uma mensagem de informação.
Você pode acessar qualquer outro componente público do objeto de exceção durante o
tratamento de exceções, dependendo do tipo estático da variável de referência. No exemplo
acima, a variável de referência é tipificada como REF TO CX_ROOT, o que restringe o acesso
aos componentes definidos em CX_ROOT. Para acessar os componentes mais específicos do
objeto de exceção, você precisa de um tipo de variável de referência de tipo mais específico.
Você também pode utilizar a classe superior CX_SY_ARITHMETIC_ERROR e a classe superior
CX_DYNAMIC_CHECK para acessar os componentes específicos do objeto de exceção.
A documentação de palavras-chave ABAP para cada instrução lista as classes cujas exceções
podem ocorrer quando essa instrução é executada.

© Direitos autorais. Todos os direitos reservados. 233


Capítulo 9 : Exceções baseadas na classe

Exceções baseadas na classe no depurador

Figura 143: Exceções baseadas na classe no modo de depuração

Se for criada uma exceção, o sistema exibe o nome da classe de exceção no campo Exceção
acionada no modo de depuração.
Se um bloco CATCH detectar a exceção, é exibida uma mensagem de êxito. O ponteiro para a
instrução atual move-se depois para esse bloco CATCH.
São exibidos dois botões se ocorrer uma exceção. Utilize os botões para analisar o objeto de
exceção e para navegar para o ponto no texto fonte onde a exceção ocorreu,
respectivamente.

Dica:
Por motivos de desempenho, o sistema na verdade não criará objetos de
exceção se o suplemento INTO estiver faltando na respectiva instrução CATCH.
Nesses casos, o botão Último objeto de exceção normalmente não aparece.
Para definir o ABAP Debugger para criar sempre o objeto de exceção, selecione a
respectiva opção nas configurações do depurador.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar exceções baseadas na classe
● Tratar exceções baseadas na classe

234 © Direitos autorais. Todos os direitos reservados.


Lição: Explicação de exceções baseadas na classe

● Depurar exceções baseadas na classe

© Direitos autorais. Todos os direitos reservados. 235


Capítulo 9 : Exceções baseadas na classe

236 © Direitos autorais. Todos os direitos reservados.


Capítulo 9
Lição 2
Definição e geração de exceções

SÍNTESE DA LIÇÃO
Esta lição explica como definir e criar classes de exceção globais.

Exemplo de negócio
Você precisa definir classes de exceção globais para seus programas ABAP Objects. Por esse
motivo, você precisa:
● Compreender a definição de classes de exceção globais
● Compreensão de como criar exceções baseadas na classe
● Compreensão de como implementar a propagação de exceção

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Definir classes de exceção globais
● Criar exceções baseadas na classe
● Propagar exceções

© Direitos autorais. Todos os direitos reservados. 237


Capítulo 9 : Exceções baseadas na classe

Definição de classes de exceção globais

Figura 144: Criação de classes de exceção globais

Você utiliza o Class Builder para criar uma classe global como descrito na biblioteca SAP. Ao
inserir o nome da classe global, utilize o prefixo CX_. Selecione a opção Classe de exceção
como o tipo de classe.

Nota:
A partir do SAP NetWeaver Application Server 6.40 (SAP NetWeaver AS 6.40),
existe um campo de seleção de classe de mensagens que você pode selecionar ao
criar a classe. Esta opção permite que o texto das classes de exceção seja
reutilizado de qualquer classe de mensagem cujo texto esteja arquivado na tabela
T100. Você não pode misturar texto de classes de mensagem e OTR em uma
classe de exceção.
Em releases anteriores ao SAP NetWeaver AS 6.40, os textos de exceção eram
arquivados exclusivamente no Online Text Repository (OTR).
Ao criar uma classe de exceção, não modifique a entrada padrão para Herda de, a
menos que você esteja ciente das consequências de efetuar a modificação.

Defina atributos adicionais em sua classe de exceção conforme necessário (por exemplo,
para ampliações genéricas a textos de exceção).

238 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e geração de exceções

Dica:
Se esse atributo for público, o Class Builder ajusta automaticamente o
construtor de instância da classe de exceção.
Um novo parâmetro de entrada é gerado e um valor pode ser definido para este
atributo ao acionar a exceção. O parâmetro de importação é gerado com o
mesmo nome do atributo. Por padrão, o parâmetro é opcional. Você pode
declarar isso obrigatório editando a assinatura do construtor.

Definição de textos de exceção variáveis

Figura 145: Definição de textos de exceção variáveis

Grave quantos textos de exceção forem necessários. Ao gravar textos de exceção, você pode
inserir atributos como parâmetros no texto estático utilizando a forma &<nome_atributo>&.

Nota:
Para o primeiro texto que você criar, utilize sempre a constante estática
predefinida como um ID. A constante tem sempre o mesmo nome que a própria
classe de exceção. Se o responsável pela exceção não indicar um texto quando a
exceção é criada, o sistema utiliza o texto com este ID.

Você define outros IDs para todos os outros textos. Em seguida, o Class Builder gera
automaticamente constantes estáticas com nomes idênticos. Quando a exceção é acionada,
transfira uma dessas constantes para o parâmetro de importação TEXTID para indicar o texto
adequado para a instância de exceção.

© Direitos autorais. Todos os direitos reservados. 239


Capítulo 9 : Exceções baseadas na classe

Nota:
Em releases anteriores ao SAP NW AS 6.40, os textos de exceção para classes de
exceção globais e suas traduções foram arquivados em OTR. Você pode atribuir
vários textos a uma única classe. Você atribui um texto a uma exceção utilizando
o atributo TEXTID, que contém o ID único global do objeto de texto em OTR em
uma instância no momento da execução. Em seguida, o método GET_TEXT
exporta este texto, substitui todos os parâmetros de texto pelo conteúdo dos
atributos relevantes, conforme necessário, e retorna o texto como uma cadeia de
caracteres.

Ative a classe de exceção depois de preencher os textos de exceção.

Para definir classes de exceção globais

1. No Class Builder, na caixa drop-down sem nome no lado esquerdo da tela, selecione
Classe/interface.

2. No campo sem nome, insira o novo nome da classe de exceção, use o prefixo ZCX_.
Pressione Enter.

3. Para criar a classe, selecione Sim.


A caixa de diálogo Criar classe é exibida.

4. Selecione o botão de rádio Classe de exceção e, se você quiser que os textos de exceção
venham de uma classe de mensagens existente, selecione o campo de seleção Com classe
de mensagens.

5. Insira uma descrição breve.

6. Não modifique a classe superior padrão CX_STATIC_CHECK. Selecione Gravar.


A caixa de diálogo Criar entrada do catálogo de objetos é exibida.

7. Na caixa de diálogo Criar entrada do catálogo de objetos, insira o nome do seu pacote e
selecione Gravar.
Uma caixa de diálogo Prompt para ordem de workbench transportável é exibida.

8. Na caixa de diálogo Solicitar workbench transportável, aceite as predefinições e selecione


Continuar.

9. Se necessário, defina atributos adicionais na sua classe de exceção (por exemplo, para
utilizar nos textos de exceção).

Nota:
Se esses atributos forem públicos, o Class Builder ajusta automaticamente o
construtor de instância da classe de exceção: um novo parâmetro de entrada
é gerado para que um valor possa ser fornecido para esse atributo ao criar a
exceção. O parâmetro de importação é gerado com o mesmo nome do
atributo. Por padrão, o parâmetro é opcional. Você pode declará-la como
obrigatória editando a assinatura do construtor.

240 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e geração de exceções

10. Selecione a guia Textos no Class Builder e crie quantos textos de exceção forem
necessários. Ao fazê-lo, você pode inserir seus atributos como parâmetros no texto
estático, sob a forma &<attribute_name>&.

Nota:
Para o primeiro texto que você criar, utilize sempre a constante estática
predefinida como um ID. Tem sempre o mesmo nome que a própria classe de
exceção. Se nenhum texto for indicado explicitamente quando a exceção é
acionada, é utilizado o texto com este ID. Você define outros IDs para todos os
outros textos. O Class Builder gera depois automaticamente constantes
estáticas com nomes idênticos. Quando a exceção é criada, você transfere
uma dessas constantes para o parâmetro de importação TEXTID, de modo a
indicar o texto apropriado para a instância de exceção.

Uso da instrução RAISE EXCEPTION

Figura 146: Variantes da instrução RAISE EXCEPTION

A figura Variantes da instrução RAISE EXCEPTION mostra exemplos para a instrução RAISE
EXCEPTION.
A geração de exceções baseadas na classe é efetuada utilizando a instrução RAISE
EXCEPTION. Existem duas variantes da instrução.
Variantes da instrução RAISE EXCEPTION ...
RAISE EXCEPTION TYPE <exception_class> [EXPORTING ...].
Esta instrução cria um novo objeto de exceção que é uma instância da classe
<exception_class>.
RAISE EXCEPTION <object_ref>.

© Direitos autorais. Todos os direitos reservados. 241


Capítulo 9 : Exceções baseadas na classe

Esta instrução utiliza um objeto de exceção existente ao qual o <object_ref> aponta.


O objeto de exceção foi criado diretamente por meio de uma instrução CREATE OBJECT ou
interceptado em um CATCH ... anterior.. INTO ...instrução.
Ao se usar a primeira variante, é possível fornecer valores para os parâmetros de construtor
usando o suplemento EXPORTING. Um desses parâmetros é usado para definir o texto de
exceção no novo objeto de exceção.

Textos de exceção

Figura 147: Definindo o texto de exceção

Todas as classes de exceção oferecem um parâmetro opcional TEXTID em seus


construtores. Use este parâmetro se mais de um texto de mensagem estiver disponível na
classe de exceção e você não quiser acionar a exceção com o texto padrão.
Para cada texto definido na ficha de registro Textos, o Class Builder gera uma constante
pública com o mesmo nome. As constantes também podem ser herdadas das classes
superiores da classe de exceção.
Por padrão, o sistema cria uma exceção com o texto que tem o mesmo nome que a classe de
exceção. Para acionar a exceção com outro texto, utilize a constante correspondente como o
parâmetro real para o parâmetro do construtor TEXTID.

242 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e geração de exceções

Nota:
O tipo das constantes e do parâmetro TEXTID no construtor é determinado pelo
fato de a classe de exceção ter sido criada ou não com o código Com classe de
mensagem. Se a classe de exceção ainda utilizar textos OTR, as constantes são do
tipo CHAR e contêm um ID técnico do texto OTR. Se a classe de exceção utilizar
uma classe de mensagem, as constantes são estruturas que contêm o nome da
classe de mensagem, o número da mensagem.

Propagação de exceção

Figura 148: Propagando exceções baseadas na classe

O tratamento de exceções que ocorrem dentro de procedimentos não precisa estar dentro do
mesmo procedimento. Em vez disso, o procedimento pode propagar a exceção para seu
chamador. O chamador pode então tratar a exceção ou propagá-la para seu próprio
chamador. Os níveis mais elevados de propagação que uma exceção pode atingir são blocos
de processamento sem áreas de dados locais, ou seja, blocos de evento ou módulos de
diálogo. Esses blocos de processamento têm que tratar as exceções propagadas. Caso
contrário, ocorre um erro em tempo de execução. O mesmo se aplica a exceções criadas
dentro desses blocos de processamento.
Para propagar uma exceção de um procedimento, você geralmente usa o suplemento
RAISING quando define a interface do procedimento. Em métodos de classes e
subprogramas locais, indique o suplemento RAISING diretamente quando você estiver
definindo o procedimento. Por exemplo:
METHODS meth_name ... RAISING cx_... cx_... ou FORM subr_name ... RAISING cx_... cx_....

© Direitos autorais. Todos os direitos reservados. 243


Capítulo 9 : Exceções baseadas na classe

O suplemento RAISING é seguido por uma lista das classes de exceção cujas instâncias
devem ser propagadas. Em métodos de classes globais, insira classes de exceção cujas
instâncias devem ser propagadas para a tabela de exceções do método no Class Builder.
Você também precisa definir o flag Classe de exceção para cada tabela de exceções. O
processo é semelhante para módulos de função. Para definir o código no Function Builder,
selecione a ficha Exceções.

Dica:
Um único método, subprograma ou módulo de função só pode acionar um tipo
de exceção, ou seja, baseado em classe ou convencional.

Propagação de exceções em várias hierarquias – níveis

Figura 149: Propagação de exceções em várias hierarquias – níveis

A propagação da exceção baseada na classe não requer que o método de chamada trata
realmente a exceção. O chamador pode passar a exceção para seu próprio chamador,
mesmo sem tratá-la.
No exemplo, o construtor propaga a exceção CX_EXC criada pelo método GET_TECH_ATTR.
Quando o erro ocorre e o programa gera a exceção, a execução do programa salta
diretamente para o bloco CATCH no programa principal.

Nota:
Se o construtor implementar o bloco opcional CLEANUP, o sistema executa este
bloco antes do bloco CATCH do programa principal.

244 © Direitos autorais. Todos os direitos reservados.


Lição: Definição e geração de exceções

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Definir classes de exceção globais
● Criar exceções baseadas na classe
● Propagar exceções

© Direitos autorais. Todos os direitos reservados. 245


Capítulo 9 : Exceções baseadas na classe

246 © Direitos autorais. Todos os direitos reservados.


Capítulo 9
Lição 3
Implementar técnicas avançadas de
tratamento de exceções

SÍNTESE DA LIÇÃO
Esta lição explica a implementação de técnicas avançadas de tratamento de exceções.

Exemplo de negócio
Você precisa usar técnicas avançadas de tratamento de exceções para detectar exceções e
tentar novamente após o tratamento de exceções em seus programas ABAP Objects. Por
esse motivo, você precisa:
● Compreensão de classes de exceção predefinidas
● Compreensão de como tratar uma classe de exceção
● Compreensão de como tentar novamente após uma exceção

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar a hierarquia de classes de exceção predefinidas
● Explicar as diferentes formas de tratamento de uma exceção
● Repetir após exceções
● Implementar exceções retomáveis
● Mapear exceções

© Direitos autorais. Todos os direitos reservados. 247


Capítulo 9 : Exceções baseadas na classe

A hierarquia de classes de exceção predefinidas

Figura 150: Integração de exceções standard no sistema de tempo de execução

A figura mostra como as exceções padrão no sistema de tempo de execução são integradas
na hierarquia de herança das classes de exceção.
A seleção da classe superior influencia a forma como a verificação de sintaxe e o ambiente de
tempo de execução tratam de uma determinada exceção. Algumas das classes de exceção
padrão são as seguintes:
● CX_STATIC_CHECK
Se uma classe de exceção herdar de CX_STATIC_CHECK, você deve tratar a exceção
relevante ou propagá-la utilizando o suplemento RAISING. Se a exceção não for tratada
nem propagada usando o suplemento RAISING, a verificação de sintaxe exibirá um aviso.
Quando você define uma nova classe de exceção global, CX_STATIC_CHECK é definida
como a classe superior por padrão.
● CX_DYNAMIC_CHECK
Para subclasses de CX_DYNAMIC_CHECK, a verificação de sintaxe não exibe nenhuma
advertência se as exceções não forem tratadas nem propagadas com o suplemento
RAISING. Se uma exceção for criada no momento da execução e você não a tratar nem
propagar, o sistema encerra o programa com um erro de tempo de execução.

248 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas de tratamento de exceções

Nota:
Os exemplos típicos desta situação são as exceções predefinidas CX_SY_...
para erros que ocorrem no ambiente de tempo de execução. São geralmente
subclasses de CX_DYNAMIC_CHECK.

● CX_NO_CHECK
Para subclasses de CX_NO_CHECK, você não pode propagar as exceções
correspondentes explicitamente utilizando o suplemento RAISING. Se você não tratar
essas exceções no bloco de processamento onde elas ocorrem, elas são propagadas
automaticamente. Se o bloco de chamada não tratar das exceções, elas são propagadas
automaticamente para o nível mais alto da hierarquia de chamadas. Se as exceções não
forem tratadas no nível superior, ocorre um erro em tempo de execução no ponto em que
elas foram criadas. Algumas exceções predefinidas com o prefixo CX_SY_... para
situações de erro no ambiente de tempo de execução são subclasses de CX_NO_CHECK.

Tratamento de exceções
Depois que uma exceção é interceptada em uma instrução CATCH, você pode tratá-la de
várias formas diferentes.

Técnicas para tratar uma exceção ocorrida em uma instrução CATCH

1. Continue o programa por trás de uma instrução ENDTRY após executar uma das
seguintes ações:

● Ignorando a exceção (não fazer nada)

● Emitindo um aviso

● Escrever em um protocolo

● Correção da situação

2. Elimine a causa do erro e inicie novamente a partir de um dos seguintes pontos:

● A partir do início do bloco TRY correspondente utilizando a instrução RETRY.


RETRY é novo a partir do SAP NetWeaver 7.0 EhP 2.

● De onde a exceção ocorreu usando a instrução RESUME.


O RESUME é novo a partir do SAP NetWeaver 7.0 EhP 2.

3. Criar e propagar uma das seguintes exceções:

● O mesmo objeto de exceção utilizando RAISE EXCEPTION <obj_ref>.

● Uma nova exceção usando RAISE EXCEPTION TYPE <exc_class>.

© Direitos autorais. Todos os direitos reservados. 249


Capítulo 9 : Exceções baseadas na classe

A instrução RETRY

Figura 151: Instrução RETRY

Ao tratar uma exceção em um bloco CATCH, use a instrução RETRY para voltar para a
instrução TRY da respectiva estrutura TRY-ENDTRY, por exemplo, se a causa da exceção
tiver sido removida durante o tratamento.

Dica:
Essa técnica é nova com o release SAP NetWeaver 7.0 EhP 2.

No exemplo, o programa principal detecta a exceção que o construtor levantou e propagou.


Depois de analisar o objeto de exceção e corrigir a situação de erro, o programa principal
repete todo o bloco TRY usando a instrução RETRY.

Cuidado:
Você deve usar RETRY com algum cuidado. Se você não remover a causa da
exceção adequadamente, seu programa entrará em um loop infinito.

250 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas de tratamento de exceções

Implementação de exceções reiniciáveis

Figura 152: Continuar a execução após uma exceção continuável

Utilize a instrução RESUME para retomar um programa imediatamente após a instrução que
acionou a exceção no texto fonte.
Você deve cumprir os seguintes pré-requisitos para utilizar a instrução RESUME:

1. A exceção deve ser capturada com a instrução CATCH usando o suplemento BEFORE
UNWIND. Isso assegura que o contexto da exceção seja mantido ativo para um possível
RESUME. Se o bloco CATCH sair sem a instrução RESUME, o sistema exclui o contexto da
exceção após o bloco CATCH ser encerrado.

2. A exceção deve ser criada com a variante RAISE RESUMABLE ... da instrução RAISE
EXCEPTION. Isso prepara o bloqueio de processamento de acionamento para o RESUME.

3. Se a exceção for propagada, você deve marcá-la como resumível em todos os níveis
hierárquicos usando o suplemento RAISING RESUMABLE ( ... ) com o nome da classe de
exceção dentro dos parênteses. Isso prepara todos os métodos que propagam a exceção
para um possível RESUME.

Dica:
Existe um campo de seleção para indicar a utilização de exceções básicas de
classe na interface de um módulo de função e a assinatura de um método.
Quando verificado, o módulo de função ou o método deve utilizar todas as
exceções baseadas na classe. Quando deixada desmarcada, todas as
exceções clássicas devem ser usadas.

© Direitos autorais. Todos os direitos reservados. 251


Capítulo 9 : Exceções baseadas na classe

O manipulador de uma determinada exceção verifica se, no momento da execução, uma


determinada exceção foi acionada e propagada retomável ou não. Todos os objetos de
exceção fornecem o atributo de instância público IS_RESUMABLE, que está definido como ’X’
ou ’ ’ pelo framework, dependendo de como a exceção foi criada e propagada. Se você
retomar uma exceção não resumível, você causa um erro em tempo de execução (classe de
exceção CX_SY_ILLEGAL_HANDLER).

Continuar a execução após uma exceção continuável

No exemplo mostrado na figura, o método GET_TECH_ATTR cria e propaga a exceção; o


construtor propaga ainda mais a exceção. Toda a criação e propagação está configurada para
que possa ser retomada. O programa principal trata a exceção com CATCH BEFORE
UNWIND ..., verifica se a exceção é realmente retomável e emite a instrução RESUME. O
sistema continua a execução de GET_TECH_ATTR imediatamente após a execução da
instrução RAISE RESUMABLE EXCEPTION.

Dica:
Neste exemplo, você mantém o contexto da exceção. Sem o suplemento
BEFORE UNWIND, o sistema exclui a instância recém-criada antes de executar o
bloco CATCH. Não seria possível continuar o método GET_GET_TECH_ATTR e o
construtor.

Nova criação e mapeamento de exceções

Criando exceções novamente

Figura 153: Geração nova de um objeto de exceção existente

252 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas de tratamento de exceções

Você cria exceções baseadas na classe com uma das seguintes variantes da instrução RAISE
EXCEPTION:
● RAISE EXCEPTION TYPE <exception_class> [EXPORTING ...]
Essa instrução cria um novo objeto de exceção, que é uma instância da classe
<exception_class>. Opcionalmente, os valores podem ser fornecidos para o construtor
usando o suplemento EXPORTING.
● RAISE EXCEPTION <object_ref>
Esta instrução utiliza um objeto de exceção existente, ou seja, qualquer que seja o objeto
de exceção <object_ref> que aponta. Este objeto de exceção é criado diretamente, usando
uma instrução CREATE OBJECT ou, mais comumente, capturado em um CATCH
anterior ... instrução INTO ... e transfira explicitamente para o chamador.

No exemplo, o construtor captura a exceção CX_EXC, que é criada pelo método


GET_TECH_ATTR. O construtor analisa o objeto de exceção, executa os ajustes necessários,
emite uma advertência, etc. Em seguida, o construtor decide transferir a exceção para o
programa principal, onde a exceção é tratada novamente.

Mapeamento de exceções

Figura 154: Mapeamento de exceções entre si

Depois de interceptar uma exceção, o programa pode criar uma segunda exceção, e assim
por diante. Um objeto de exceção se torna inválido quando o programa deixa o bloco CATCH.
Por isso, o manipulador no nível superior só pode acessar o último objeto de exceção. No
entanto, você pode encadear objetos de exceção, ou seja, você pode deixar que um objeto de
exceção aponte para um antes, que aponte um antes, etc. O manipulador de uma exceção
pode seguir a cadeia e avaliar cada objeto de exceção na sequência.

© Direitos autorais. Todos os direitos reservados. 253


Capítulo 9 : Exceções baseadas na classe

Todas as classes de exceção fornecem um atributo de instância pública PREVIOUS. Você


digita o atributo com REF TO CX_ROOT para apontar para objetos de exceção arbitrários. Os
construtores de todas as classes de exceção têm um parâmetro de importação PREVIOUS,
do mesmo tipo, que pode ser usado para vincular um objeto de exceção existente a um novo.
No exemplo da figura, o construtor detecta a exceção que foi criada pelo método
GET_TECH_ATTR. Após analisar a exceção, o construtor cria uma nova exceção de uma
classe de exceção diferente. Ele encerra o objeto de exceção existente para o novo,
transferindo uma referência ao objeto existente para o construtor do novo objeto. Como
resultado, o atributo PREVIOUS do novo objeto de exceção aponta para o objeto de exceção
que o precede.
O programa principal chama a segunda exceção e acessa o segundo objeto de exceção. No
entanto, utilizando o atributo público PREVIOUS, o programa principal pode navegar para o
outro objeto de exceção e analisá-lo. O programa principal pode acessar cada instância em
uma cadeia de exceções e seguir o histórico das exceções acionadas na hierarquia de
chamadas.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar a hierarquia de classes de exceção predefinidas
● Explicar as diferentes formas de tratamento de uma exceção
● Repetir após exceções
● Implementar exceções retomáveis
● Mapear exceções

254 © Direitos autorais. Todos os direitos reservados.


Capítulo 9

Avaliação da aprendizagem

1. Qual das seguintes afirmações é utilizada para criar exceções baseadas na classe?
Escolha a resposta correta.

X A EXPORTING

X B EXCEÇÃO RAISE

X C CREATE OBJECT

X D CATCH

2. Qual dos seguintes blocos é utilizado para detectar e tratar exceções?


Escolha a resposta correta.

X A IMPORTANDO….RETURNING

X B MÉTODO…. ENDMETHOD

X C TRY … ENDTRY

X D TRY...CATCH...ENDTRY

3. Uma exceção baseada na classe só pode ser tratada se a instrução que a criou estiver
incluída em uma estrutura de controle TRY-ENDTRY.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

4. As estruturas TRY-ENDTRY podem ser aninhadas em qualquer nível.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 255


Capítulo 9 : Avaliação da aprendizagem

5. Você só pode especificar duas classes de exceção para a instrução CATCH.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

6. Se for criada uma exceção, o nome da classe de exceção é exibido no campo __________
no modo de depuração.
Escolha a resposta correta.

X A exceção acionada

X B último objeto de exceção

X C watchpoint

X D layout

7. Qual das seguintes adições de sintaxe é utilizada para propagar uma exceção de um
procedimento?
Escolha a resposta correta.

X A CATCH

X B RAISING

X C METHODS

X D FORM

8. Para subclasses de ____________, as exceções correspondentes não podem ser


propagadas explicitamente utilizando o suplemento RAISING.
Escolha a resposta correta.

X A CX_STATIC_CHECK

X B CX_NO_CHECK

X C CX_DYNAMIC_CHECK

256 © Direitos autorais. Todos os direitos reservados.


Capítulo 9 : Avaliação da aprendizagem

9. Quais das seguintes opções são formas de tratar uma exceção?


Escolha as respostas corretas.

X A Continuar programa

X B Eliminar a causa do erro

X C Não propagar uma exceção

X D Chamar método CX_SYSTEM_HANDLE

10. Qual das seguintes opções é usada para voltar para a instrução TRY?
Escolha a resposta correta.

X A RETRY

X B CATCH

X C TRY-ENTRY

X D RAISE

11. Qual das seguintes opções é um pré-requisito para utilizar a instrução RESUME?
Escolha as respostas corretas.

X A A exceção deve ser interceptada com o suplemento BEFORE UNWIND.

X B A exceção deve ser interceptada com o suplemento AFTER UNWIND.

X C A exceção deve ser propagada com o suplemento RESUMABLE( ).

X D A exceção deve ser criada com o suplemento RESUMABLE.

© Direitos autorais. Todos os direitos reservados. 257


Capítulo 9

Avaliação da aprendizagem - Respostas

1. Qual das seguintes afirmações é utilizada para criar exceções baseadas na classe?
Escolha a resposta correta.

X A EXPORTING

X B EXCEÇÃO RAISE

X C CREATE OBJECT

X D CATCH

Você está correto! As exceções baseadas na classe são criadas pela instrução RAISE
EXCEPTION ou pelo ambiente de tempo de execução. Saiba mais na tarefa Utilização da
instrução RAISE EXCEPTION, na lição Explicação de exceções baseadas na classe, do
curso BC401.

2. Qual dos seguintes blocos é utilizado para detectar e tratar exceções?


Escolha a resposta correta.

X A IMPORTANDO….RETURNING

X B MÉTODO…. ENDMETHOD

X C TRY … ENDTRY

X D TRY...CATCH...ENDTRY

Você está correto! Você trata a exceção utilizando a instrução CATCH na estrutura TRY-
ENDTRY. Saiba mais na tarefa Tratamento de exceções baseado na classe, na lição
Explicação de exceções baseadas na classe, no curso BC401.

3. Uma exceção baseada na classe só pode ser tratada se a instrução que a criou estiver
incluída em uma estrutura de controle TRY-ENDTRY.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Saiba mais na tarefa Downcasts com interfaces na lição Integração de
modelos de classe utilizando interfaces, no curso BC401.

258 © Direitos autorais. Todos os direitos reservados.


Capítulo 9 : Avaliação da aprendizagem - Respostas

4. As estruturas TRY-ENDTRY podem ser aninhadas em qualquer nível.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Como todas as estruturas de controle em ABAP Objects, você pode
aninhar estruturas TRY-ENDTRY em qualquer nível. Em particular, o bloco TRY, o bloco
CATCH e o bloco CLEANUP podem conter estruturas TRY-ENDTRY completas. Saiba
mais na tarefa Tratamento de exceções baseado na classe, na lição Explicação de
exceções baseadas na classe, no curso BC401.

5. Você só pode especificar duas classes de exceção para a instrução CATCH.


Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Indique qualquer número de classes de exceção na instrução CATCH.
Assim, você define um manipulador de exceções para todas essas classes de exceção e
suas subclasses. Saiba mais na tarefa Tratamento de exceções baseado na classe, na
lição Explicação de exceções baseadas na classe, no curso BC401.

6. Se for criada uma exceção, o nome da classe de exceção é exibido no campo __________
no modo de depuração.
Escolha a resposta correta.

X A exceção acionada

X B último objeto de exceção

X C watchpoint

X D layout

Você está correto! Se for criada uma exceção, o sistema exibe o nome da classe de
exceção no campo Exceção acionada no modo de depuração. Saiba mais na tarefa
Exceções baseadas na classe no depurador, na lição Explicação das exceções baseadas
na classe, do curso BC401.

© Direitos autorais. Todos os direitos reservados. 259


Capítulo 9 : Avaliação da aprendizagem - Respostas

7. Qual das seguintes adições de sintaxe é utilizada para propagar uma exceção de um
procedimento?
Escolha a resposta correta.

X A CATCH

X B RAISING

X C METHODS

X D FORM

Você está correto! Para propagar uma exceção de um procedimento, você geralmente
usa o suplemento RAISING quando define a interface do procedimento. Saiba mais na
tarefa Propagação de exceções, na lição Definição e geração de exceções do curso
BC401.

8. Para subclasses de ____________, as exceções correspondentes não podem ser


propagadas explicitamente utilizando o suplemento RAISING.
Escolha a resposta correta.

X A CX_STATIC_CHECK

X B CX_NO_CHECK

X C CX_DYNAMIC_CHECK

Você está correto! Para subclasses de CX_NO_CHECK, você não pode propagar as
exceções correspondentes explicitamente utilizando o suplemento RAISING. Se você não
tratar essas exceções no bloco de processamento onde elas ocorrem, elas são
propagadas automaticamente. Saiba mais na tarefa Hierarquia de classes de exceção
predefinidas na lição Definição e geração de exceções do curso BC401.

9. Quais das seguintes opções são formas de tratar uma exceção?


Escolha as respostas corretas.

X A Continuar programa

X B Eliminar a causa do erro

X C Não propagar uma exceção

X D Chamar método CX_SYSTEM_HANDLE

Você está correto! Técnicas para tratar uma exceção obtida em uma instrução CATCH:
Continue o programa por trás de uma instrução ENDTRY, remova a causa do erro e inicie
novamente, gere e propague uma exceção. Saiba mais na tarefa, Tratamento de
exceções, na lição Efinir e criar exceções, no curso BC401.

260 © Direitos autorais. Todos os direitos reservados.


Capítulo 9 : Avaliação da aprendizagem - Respostas

10. Qual das seguintes opções é usada para voltar para a instrução TRY?
Escolha a resposta correta.

X A RETRY

X B CATCH

X C TRY-ENTRY

X D RAISE

Você está correto! Ao tratar uma exceção em um bloco CATCH, use a instrução RETRY
para voltar para a instrução TRY da respectiva estrutura TRY-ENDTRY, por exemplo, se a
causa da exceção tiver sido removida durante o tratamento. Saiba mais na tarefa, A
declaração RETRY, na lição Implementação de técnicas avançadas de tratamento de
exceções, no curso BC401.

11. Qual das seguintes opções é um pré-requisito para utilizar a instrução RESUME?
Escolha as respostas corretas.

X A A exceção deve ser interceptada com o suplemento BEFORE UNWIND.

X B A exceção deve ser interceptada com o suplemento AFTER UNWIND.

X C A exceção deve ser propagada com o suplemento RESUMABLE( ).

X D A exceção deve ser criada com o suplemento RESUMABLE.

Você está correto! A exceção deve ser capturada com a instrução CATCH usando o
suplemento BEFORE UNWIND. Isso assegura que o contexto da exceção seja mantido
ativo para um possível RESUME. Se a exceção for propagada, você deve marcá-la como
resumível em todos os níveis hierárquicos usando o suplemento RAISING RESUMABLE
( ... ) com o nome da classe de exceção dentro dos parênteses. A exceção deve ser criada
com a variante RAISE RESUMABLE ... da instrução RAISE EXCEPTION. Saiba mais na
tarefa Implementação de exceções que podem ser retomadas, na lição Implementação de
técnicas avançadas de tratamento de exceções, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 261


Capítulo 9 : Avaliação da aprendizagem - Respostas

262 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 10 Teste funcional

Lição 1
Teste funcional com unidade ABAP 265

OBJETIVOS DO CAPÍTULO

● Executar teste funcional


● Utilizar classes de teste e métodos de teste
● Executar teste funcional ABAP avançado

© Direitos autorais. Todos os direitos reservados. 263


Capítulo 10 : Teste funcional

264 © Direitos autorais. Todos os direitos reservados.


Capítulo 10
Lição 1
Teste funcional com unidade ABAP

SÍNTESE DA LIÇÃO
Esta lição explica como utilizar testes de módulo ABAP para verificar o comportamento
correto do seu programa.

Exemplo de negócio
Você deseja utilizar testes ABAP Unit para testes automatizados e eficientes de sua
codificação ABAP.

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Executar teste funcional
● Utilizar classes de teste e métodos de teste
● Executar teste funcional ABAP avançado

Teste funcional
Teste funcional é um processo no qual um desenvolvedor garante que as menores unidades
testáveis de seu código, como métodos, sejam verificáveis. Isso facilita garantir a qualidade,
refatorar o código, realizar testes de regressão e implementar de acordo com o modelo de
desenvolvimento orientado por testes. O teste funcional é parte integrante da fase de
desenvolvimento.

Figura 155: Princípio de teste de unidade

© Direitos autorais. Todos os direitos reservados. 265


Capítulo 10 : Teste funcional

Os testes de módulo são escritos como classes locais dentro do programa principal de uma
classe global (pool de classes). Eles atuam como usuários da classe e, como tal, só podem
acessar seus componentes públicos. Cada teste é implementado como um método da classe,
com o objetivo de realizar operações de remoção na classe em teste que levam a um estado
particular verificável da classe. Cada método de teste é executado de forma independente.

Geração de código de teste


O ABAP Unit é um framework de teste funcional integrado na linguagem ABAP. Os testes de
ABAP Unit são transportados com os objetos do repositório ABAP que testam, portanto, o
código-fonte está disponível em todos os sistemas de desenvolvimento, teste e produção.

Figura 156: Geração de código de teste

No entanto, isso não significa necessariamente que os testes de ABAP Unit possam ser
executados em todos os sistemas. O parâmetro de perfil abap/test_generation indica para
que sistemas é gerada a carga dos testes. Normalmente, a codificação de teste só é gerada
em sistemas de desenvolvimento e de teste. Em sistemas produtivos, as classes de teste são
excluídas das versões de carga para minimizar o tamanho das cargas. Isso impede que a
codificação de teste tenha qualquer impacto na função e performance no sistema produtivo.

Vantagens do teste funcional

● Definir seus testes no ABAP


- Não é necessário aprender um idioma de script de teste
● Testes fáceis enquanto você desenvolve
- Ferramenta de teste integrada ao ABAP Workbench e às ferramentas de
desenvolvimento ABAP (ADT)

266 © Direitos autorais. Todos os direitos reservados.


Lição: Teste funcional com unidade ABAP

● Teste em massa
- Teste funcional integrado ao Code Inspector e ao ABAP Test Cockpit
● Fácil execução e avaliação
- Qualquer pessoa pode executar um teste sem conhecimento ABAP
● Abrangência do teste integrada
- Avaliar qual porcentagem do seu código está coberta pelos seus testes
● Nenhum consumo de recursos em sistemas produtivos
- Decidir em quais sistemas a codificação de teste é gerada e carregada
● Classificação de teste em relação ao consumo de tempo e danos potenciais
- Identificar testes demorados ou críticos (por exemplo, testes que atualizam dados
persistentes)

Definição de uma classe de teste de unidade


Os testes de ABAP Unit são realizados como classes de teste locais com os métodos de teste
necessários em seus programas de aplicação. Você define classes de teste locais
adicionando o suplemento FOR TESTING na definição de classe. Outras adições são usadas
para classificar os testes de acordo com o consumo de tempo e o impacto na integridade dos
dados. Quando você testa seu programa utilizando ABAP Unit, uma instância é gerada
automaticamente para cada classe de teste e os métodos de teste correspondentes são
executados.
A definição de classes de teste fornece um limite claro entre codificação produtiva e
codificação de teste. Você pode chamar a codificação produtiva a partir das classes de teste.
Mas o compilador não permitirá que você acesse uma classe de teste a partir de uma classe
de aplicação normal.

© Direitos autorais. Todos os direitos reservados. 267


Capítulo 10 : Teste funcional

Figura 157: Definição de classes de teste ABAP Unit

Métodos de teste
Os métodos de teste são definidos como métodos de instância sem parâmetros
(preferencialmente privados) nas suas classes de teste locais. Como uma classe de teste, a
sua definição também requer o suplemento FOR TESTING.

268 © Direitos autorais. Todos os direitos reservados.


Lição: Teste funcional com unidade ABAP

A classe de serviço CL_ABAP_UNIT_ASSERT

Figura 158: Implementação de métodos de teste ABAP Unit

Um método de teste contém o código do programa a ser executado para teste, seguido por
uma verificação dos resultados derivados do código de teste. O conteúdo das variáveis a
serem testadas é comparado com os valores previstos, chamando métodos de verificação
padrão da classe de serviço CL_ABAP_UNIT_ASSERT (métodos estáticos ASSERT_...). Se os
respectivos valores não corresponderem à expectativa, o método de verificação pode inserir
uma nota, uma advertência ou mesmo um erro no log de teste.

Parâmetros de método

Tabela 2: Parâmetros de importação de método


Os métodos de controle têm os seguintes parâmetros de importação:
Parâmetro Descrição

ativo Variável a ser verificada


exp Valor esperado (métodos assert_equal s, assert_difference)
msg Mensagem a ser exibida no log se o valor não corresponder ao esperado
nível A gravidade do erro a ser registrado em log (constantes de classe TOLE-
RABLE, CRITICAL, FATAL)
sair O que é cancelado se o teste falhar (constantes de classe NO, METHOD,
CLASS, PROGRAM)

© Direitos autorais. Todos os direitos reservados. 269


Capítulo 10 : Teste funcional

Os métodos de verificação também têm um parâmetro de retorno (assertion_failedvalor


= ’X’ /SPACE). Isso pode ser utilizado pelo método de teste para descobrir os resultados da
verificação.

Execução de teste ABAP Unit


Para executar um teste de ABAP Unit, proceda da seguinte forma:

Como executar um teste ABAP Unit

ABAP Workbench
● Para um programa, na barra de menu, selecione → → ProgramExecuteUnit Tests.
● Para uma classe, na barra de menu, selecione Classe → Testes → RunUnit.
● Na área da tela Nome do objeto, clique com o botão direito do mouse no nome do item
e selecione Executar → testes de unidade.

Ferramentas de desenvolvimento ABAP (ADT)


● Na barra de menu do Project Explorer, selecione → RunRun AsABAP → Unit Tests.

Ferramentas para teste em massa


● No ABAP Test Cockpit (ATC), utilize o perfil de verificação com as verificações
BC_AUNIT, BC_AUNIT_M ou BC_AUNIT_L.
● No Code Inspector (SCI), utilize a variante de verificação com a verificação Lista de
→ verificações de testes dinâmicos → ABAP Unit.

O teste ABAP Unit está incluído nos dois ambientes de desenvolvimento ABAP. Nos dois
ambientes, você pode executar testes de ABAP Unit para objetos do repositório individuais
(classe, grupo de funções, programa) e também para um pacote de desenvolvimento
completo. Para permitir testes em massa, o framework de teste de unidade também está
incluído em outras ferramentas, como o Code Inspector (código de transação: SCI) e o ABAP
Test Cockpit (código de transação ATC).
A figura, Exemplo: Executar um teste de unidade ABAP no ABAP Workbench, ilustra como
iniciar um teste de unidade para um programa executável.

270 © Direitos autorais. Todos os direitos reservados.


Lição: Teste funcional com unidade ABAP

Figura 159: Exemplo: executar um teste ABAP Unit no ABAP Workbench

Resultados do teste ABAP Unit


Embora os testes possam ser realizados de forma diferente, os resultados são apresentados
de forma semelhante.

Figura 160: Exemplo de resultado de teste no ABAP Workbench

No lado esquerdo da figura Exemplo de resultado de teste no ABAP Workbench, existe uma
lista dos testes executados (métodos de teste agrupados por classes de teste). Um semáforo
vermelho indica as classes e os métodos com erros. Quando você seleciona uma entrada com
um semáforo vermelho, uma lista de erros é exibida na área de tela Alertas e mensagens no
lado direito. Quando você clica em uma mensagem de erro, os detalhes da mensagem são

© Direitos autorais. Todos os direitos reservados. 271


Capítulo 10 : Teste funcional

exibidos na área da tela Análise. Na área Análise, você pode navegar para o texto fonte do
método de teste.

Teste expositores
Um expositor é uma configuração de teste criada antes da chamada de um método de teste e
garante um comportamento de teste único. Um expositor é composto por dados de teste,
objetos de teste, recursos e conexões.

Tabela 3: Métodos privados e sem parâmetros em uma classe de teste


Para criar um expositor, implemente os seguintes métodos privados e sem parâmetros em
uma classe de teste:
Métodos Descrição

CONFIGURAÇÃO Método de instância, que é executado antes de cada método de


teste individual da classe.
TEARDOWN Método de instância, que é executado após cada método de
teste individual da classe.
CLASS_SETUP Método estático, que é executado uma vez antes do primeiro
método de teste da classe.
CLASS_TEARDOWN Método estático, que é executado uma vez após o último méto-
do de teste da classe.

Tabela 4: Modelo de fases dos métodos de teste de unidade e expositor


1 Iniciar sessão interna para classe de teste
2 Criação de classe da classe de teste
3 Configuração do expositor de classe (método CLASS_SETUP)
4a Para cada método de teste: Criar instância de classe de teste
4b Reestruturação do expositor (método SE-
TUP)
4c Execução do método de teste
4d Desmontagem de expositor (método TEA-
RDOWN)
5 Desmontagem da classe expositor (método CLASS_TEARDOWN)

Os métodos têm nomes predefinidos e são chamados automaticamente pelo ambiente de


tempo de execução ABAP quando o teste é executado.

Dica:
Devido à forma como estes métodos são chamados, todos os testes que utilizam
o mesmo expositor devem ser incluídos na mesma classe de teste.

Os métodos de expositor referem-se sempre à classe atual. Em classes de teste que herdam
umas das outras, os métodos de expositor são executados para cada classe envolvida. Os

272 © Direitos autorais. Todos os direitos reservados.


Lição: Teste funcional com unidade ABAP

métodos de setup são executados das classes superiores para as subclasses e os métodos
de desmontagem das subclasses para as classes superiores.

Abrangência do teste
O ABAP Unit permite que você verifique a exatidão de seu teste funcional e encontre
facilmente qualquer código não testado.
Para executar testes de ABAP Unit com medição de cobertura de código, selecione
→ ExecuteUnit Tests With → Coverage no menu de contexto do objeto de desenvolvimento
na área de navegação (ABAP Workbench) ou Coverage As → ABAP Unit Test no menu de
contexto do Project Explorer (ADT).
A cobertura alcançada pela execução dos testes de ABAP Unit é exibida ao lado do resultado
do teste em uma ficha de registro adicional.

Figura 161: Exemplo de cobertura de teste de unidade ADT

Você pode alternar entre a cobertura do extrato, a cobertura da filial e a cobertura do


procedimento (“procedimento” em aberto para bloco de processamento).

Dica:
A análise de cobertura está muito melhor integrada às ferramentas de
desenvolvimento ABAP. Enquanto que no ABAP Workbench você só vê uma lista
de números.

Tipos de cobertura
As ferramentas de desenvolvimento ABAP exibem a cobertura no editor de código-fonte da
seguinte forma:

Cobertura de instruções
Cada linha executável é destacada em verde ou vermelho. Verde indica que o extrato foi
excedido. Vermelho indica que a linha não foi executada.
Cobertura da filial

© Direitos autorais. Todos os direitos reservados. 273


Capítulo 10 : Teste funcional

As filiais em seu código são destacadas em vermelho se não tiverem sido executadas. As
ramificações são destacadas em verde se forem executadas e resolvidas para verdadeiro
e falso. As ramificações são destacadas em amarelo se tiverem sido executadas, mas
resolvidas somente para uma condição, verdadeira ou falsa.
Cobertura do procedimento
Os pontos de entrada de procedimento são destacados em verde ou vermelho para
indicar se foram chamados ou não.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Executar teste funcional
● Utilizar classes de teste e métodos de teste
● Executar teste funcional ABAP avançado

274 © Direitos autorais. Todos os direitos reservados.


Capítulo 10

Avaliação da aprendizagem

1. No ABAP Unit, o método SETUP é chamado antes de cada método de teste individual.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

2. Quais das seguintes afirmações sobre testes de ABAP Unit são verdadeiras?
Escolha as respostas corretas.

X A As classes de teste não são geradas em um sistema produtivo

X B Os métodos de teste podem acessar os componentes privados da classe em teste

X C A classe em teste pode acessar os métodos da classe de teste

X D Cada método de teste é executado independentemente de todos os outros

© Direitos autorais. Todos os direitos reservados. 275


Capítulo 10

Avaliação da aprendizagem - Respostas

1. No ABAP Unit, o método SETUP é chamado antes de cada método de teste individual.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! O método SETUP é um método de instância, que é executado antes de
cada método de teste individual da classe. Saiba mais na tarefa Fixações de texto na lição
Teste de unidade com unidade ABAP do curso BC401.

2. Quais das seguintes afirmações sobre testes de ABAP Unit são verdadeiras?
Escolha as respostas corretas.

X A As classes de teste não são geradas em um sistema produtivo

X B Os métodos de teste podem acessar os componentes privados da classe em teste

X C A classe em teste pode acessar os métodos da classe de teste

X D Cada método de teste é executado independentemente de todos os outros

Você está correto! Normalmente, a codificação de teste só é gerada em sistemas de


desenvolvimento e de teste. Em sistemas produtivos, as classes de teste são excluídas
das versões de carga para minimizar o tamanho das cargas. Cada método de teste é
executado de forma independente. Leia mais nas tarefas, Teste funcional e Geração do
código de teste, na lição Teste funcional com unidade ABAP, do curso BC401.

276 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 11 Modelos de design orientados a
objetos

Lição 1
Implementar técnicas avançadas orientadas a objetos 279

Lição 2
Implementação de métodos factory e padrões singleton 289

Lição 3
Implementação de classes factory utilizando amizade 293

OBJETIVOS DO CAPÍTULO

● Implementar classes abstratas


● Implementar classes finais
● Acessar tabelas internas com referências a objetos
● Chamar métodos de navegação
● Criar objetos com o operador NEW
● Trabalhar com condições no tipo dinâmico de uma referência a objetos
● Restringir a visibilidade do construtor de instância
● Implementar métodos factory
● Implementar o modelo singleton
● Implementar relações de amizade

© Direitos autorais. Todos os direitos reservados. 277


Capítulo 11 : Modelos de design orientados a objetos

278 © Direitos autorais. Todos os direitos reservados.


Capítulo 11
Lição 1
Implementar técnicas avançadas orientadas a
objetos

SÍNTESE DA LIÇÃO
Esta lição explica como implementar classes abstratas e classes finais, como acessar tabelas
internas com referências a objetos e como chamar os métodos de navegação.

Exemplo de negócio
Você precisa adicionar técnicas especiais de programação orientada a objetos às suas
implementações do ABAP Objects. Por esse motivo, você precisa:
● Compreensão de como definir classes abstratas
● Compreensão de como definir métodos abstratos
● Compreensão de como definir classes finais
● Compreensão de como definir métodos finais
● Compreensão de como utilizar atributos públicos protegidos contra gravação
● Compreensão de como chamar métodos de navegação
● Compreensão de como encadear métodos funcionais
● Compreensão de como definir a visibilidade do construtor de instância

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar classes abstratas
● Implementar classes finais
● Acessar tabelas internas com referências a objetos
● Chamar métodos de navegação
● Criar objetos com o operador NEW
● Trabalhar com condições no tipo dinâmico de uma referência a objetos
● Restringir a visibilidade do construtor de instância

© Direitos autorais. Todos os direitos reservados. 279


Capítulo 11 : Modelos de design orientados a objetos

Classes abstratas

Figura 162: Classes abstratas e métodos abstratos

A classe abstrata contém a definição e a implementação, mas não pode ser instanciada.
Utilize o suplemento ABSTRACT na instrução CLASS para criar uma classe abstrata. Super
classes são um uso típico para classes abstratas, já que elas não devem ser instanciadas a si
mesmas, mas suas subclasses são.
Em uma classe abstrata, você pode definir métodos abstratos, entre outras coisas. Isso
significa que o método abstrato não pode ser implementado nessa classe. Em vez disso, ela é
implementada em uma subclasse da classe. Se a subclasse dessa classe não for abstrata, os
métodos abstratos devem ser redefinidos e implementados na subclasse pela primeira vez.

Nota:
O indicador relevante está no Class Builder, na ficha de registro Atributos para
essa classe ou método.

Referências a tais classes abstratas podem ser usadas para acesso polimórfico a instâncias
de subclasse. Os métodos estáticos não podem ser abstratos porque não podem ser
redefinidos.

280 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas orientadas a objetos

Classes finais

Figura 163: Classes e métodos finais

Evite que uma classe seja herdada utilizando o suplemento FINAL com a instrução de classe.
Você pode evitar que um método seja redefinido utilizando o suplemento FINAL com a
instrução methods.

Nota:
O indicador relevante está no Class Builder, na ficha de registro Atributos para
essa classe ou método.

Por isso, todos os métodos de uma classe final são implicitamente finais. Você não pode
repetir o suplemento FINAL nos próprios métodos. As classes que são abstratas e finais
devem conter apenas componentes estáticos.

Tabelas internas com referências a objetos


Vimos em uma seção anterior que referências a objetos podem ser armazenadas em tabelas
internas. Isso é usado, particularmente, para implementar associações. Entretanto, não
discutimos ainda como devemos recuperar um objeto específico de uma lista. A figura
Acesso de leitura a uma tabela com referências a objetos fornece um exemplo de como isso
pode ser alcançado.

© Direitos autorais. Todos os direitos reservados. 281


Capítulo 11 : Modelos de design orientados a objetos

Figura 164: Acesso de leitura a uma tabela com referências a objetos

As referências a objetos podem ser arquivadas em tabelas internas.


O exemplo na figura, Acesso de leitura a uma tabela com referências a objetos, explica como
recuperar um objeto específico de uma lista desse tipo. A referência a objetos é armazenada
em uma tabela com algumas informações-chave. No exemplo, as informações-chave são a
marca e o modelo do veículo. A referência ao objeto pode ser facilmente recuperada por meio
dessas informações-chave. Esta técnica implica um armazenamento redundante de
informações, uma vez que os valores-chave já estão armazenados em atributos do objeto.

282 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas orientadas a objetos

Acesso de leitura com o uso de atributos públicos

Figura 165: Acesso de leitura com o uso de atributos públicos

Como mostrado na figura Acesso de leitura utilizando atributos públicos, a redundância das
informações-chave pode ser evitada tornando públicos os atributos-chave. Os atributos
públicos podem ser utilizados diretamente nas instruções para acessar tabelas internas
como READ TABLE e LOOP AT. A expressão TABE_LINE utilizada aqui é uma parte integrada
da linguagem ABAP. Quando o tipo de linha de uma tabela interna é um tipo de dados
elementar em vez de um tipo de estrutura, você precisa usar TABLE_LINE. Essas tabelas
internas têm apenas uma coluna sem nome. TABLE_LINE é usado como nome de coluna
genérico para essa coluna única.

Dica:
É contra os princípios fundamentais da programação orientada a objetos tornar
públicos os atributos. Infelizmente, o ABAP não permite que você utilize
métodos funcionais (como os métodos no nosso exemplo GET_MAKE,
GET_MODEL, etc.) no lado esquerdo das cláusulas WHERE e adições WITH KEY.
Por isso, os atributos públicos só são utilizados em alguns casos especiais no
modo somente leitura.

© Direitos autorais. Todos os direitos reservados. 283


Capítulo 11 : Modelos de design orientados a objetos

Métodos de navegação e chamadas de método em cadeia

Figura 166: Métodos de navegação e encadeamento das chamadas de método

Associações como agregações e composições são um importante princípio de projeto de


programação orientada a objetos. Uma associação significa que, no momento da execução,
uma instância de uma classe arquiva referências a objetos de outra classe.
Classes que têm outras classes associadas a elas frequentemente vêm com métodos que
retornam uma das referências armazenadas ao chamador. Tais métodos são frequentemente
chamados de métodos de navegação, pois podem ser usados para navegar de um objeto
para outro. No exemplo, a classe LCL_VEHICLE está associada à classe LCL_RENTAL. A
classe LCL_RENTAL fornece o método de navegação GET_VEHICLE.
Muitas vezes, o objetivo de navegar de um objeto para outro é acessar um único método
desse outro objeto. Podemos encadear chamadas de método, ou seja, podemos chamar
diretamente um método do objeto que o método de navegação retorna. Essa técnica não está
restrita ao encadeamento de dois métodos. Em modelos de objeto mais complicados, é
possível encadear qualquer número de métodos.

284 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas orientadas a objetos

Criação de objetos com o operador NEW

Figura 167: Criação de objetos com o operador NEW

O operador NEW cria uma nova instância de uma classe, substituindo assim CREATE
OBJECT. Após NOVO, você deve indicar a classe que quer instanciar. No exemplo da figura
Criação de objetos com o operador NEW, o sinal de hash (#) indica que a classe a ser
instanciada deve ser derivada da definição da variável de referência, de modo que go_vehicle
manterá uma referência a uma instância da classe lcl_vehicle. No segundo exemplo, é criada
uma instância de subclasse, por isso é necessário digitar explicitamente com a subclasse
desejada.
Observe que o operador NEW só pode aceitar os parâmetros de importação do construtor e
que não é possível tratar exceções convencionais baseadas em sy-subrc. Você trata exceções
baseadas na classe colocando a instrução que contém o operador NEW em um TRY...
CATCH... ENDTRY normalmente.
O operador NEW está disponível desde o release 7.40.

© Direitos autorais. Todos os direitos reservados. 285


Capítulo 11 : Modelos de design orientados a objetos

Utilização de NEW na posição de expressão

Figura 168: Utilização de NEW na posição de expressão

É possível usar o operador NEW em muitas posições de expressão, especialmente como um


parâmetro real de um método.
No primeiro exemplo da figura, Usando NOVO na posição de expressão, um objeto é criado
pouco antes de ser necessário como entrada para uma instrução APPEND.
No segundo exemplo, imediatamente antes de uma chamada de método, criamos uma
instância de veículo para utilizá-la como valor real para um parâmetro de método.
No terceiro exemplo, criamos a instância ALV usando NEW e, em vez de passar uma variável
de referência para o parâmetro i_parent, criamos uma instância do controle de container no
momento. O operador interno NEW não pode utilizar o sinal hash para derivar implicitamente
o tipo da nova variável, uma vez que o parâmetro formal i_parent do construtor ALV tem o
tipo REF TO cl_gui_container, que é uma classe superior que não pode ser utilizada como
container.

Condições para tipo dinâmico de referência a objetos

Figura 169: Verificar tipo dinâmico com expressão de predicado IS INSTANCE OF

A partir do release AS ABAP 7.50, você pode utilizar a expressão IS INSTANCE OF para
descobrir se uma referência a objetos aponta para uma instância de uma determinada classe.

286 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar técnicas avançadas orientadas a objetos

IS INSTANCE OF é verdadeiro se o objeto em questão for uma instância da classe


especificada ou de uma de suas subclasses.

Caso especial TIPO DE CASO DE distinção para variáveis de referência a objetos

Figura 170: Caso especial TIPO DE CASO DE distinção para variáveis de referência a objetos

Disponível a partir do release 7.50, a estrutura de controle CASE TYPE OF permite distinguir
entre diferentes tipos possíveis de uma referência a objetos. O bloco WHEN TYPE
correspondente é processado se o tipo dinâmico da variável de referência a objetos
corresponder à classe indicada. O suplemento opcional INTO permite executar um down cast
diretamente especificando uma variável de referência.

Visibilidade do construtor de instância

Figura 171: Configuração implícita da visibilidade do construtor de instância

No ABAP Objects, podemos restringir a visibilidade do construtor de instância. Se a


visibilidade do construtor de instância for restrita, as instruções CREATE OBJECT para
instanciar essa classe só são permitidas em determinadas partes da codificação.

© Direitos autorais. Todos os direitos reservados. 287


Capítulo 11 : Modelos de design orientados a objetos

Os tipos de visibilidades para o construtor de instância são os seguintes:


● PRIVATE
Se uma classe tem um construtor de instância privado, ela só pode ser instanciada a partir
da própria classe, normalmente em métodos estáticos definidos para esse fim. Estes
métodos são às vezes chamados de Factory-Methods.
● PROTECTED
Se o construtor de instância estiver protegido, a visibilidade é ampliada para todas as suas
subclasses, ou seja, as subclasses também podem criar instâncias da classe.
● PÚBLICO
Um construtor de instância pública é a configuração de visibilidade padrão: Instâncias da
classe podem ser criadas em qualquer lugar, dentro da própria classe, dentro de outras
classes, ou, mesmo em uma parte não orientada a objetos do programa (por exemplo, o
programa principal).

Defina a visibilidade usando o suplemento CREATE com a instrução CLASS.

Nota:
O código correspondente encontra-se no Class Builder na ficha de registro
Atributos da respectiva classe.

Dica:
A visibilidade do construtor não é definida colocando a definição do método
CONSTRUCTOR na respectiva seção da definição de classe. Na verdade, antes
do SAP NetWeaver 7.0, era obrigatório colocar o construtor sintaticamente na
seção pública. Desde o SAP NetWeaver 7.0, é permitido, mas não é necessário
colocar o construtor na seção protegida ou privada - se isso não for mais
restritivo do que o suplemento CREATE… na definição de classe. Isso é para
aumentar a legibilidade da codificação.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar classes abstratas
● Implementar classes finais
● Acessar tabelas internas com referências a objetos
● Chamar métodos de navegação
● Criar objetos com o operador NEW
● Trabalhar com condições no tipo dinâmico de uma referência a objetos
● Restringir a visibilidade do construtor de instância

288 © Direitos autorais. Todos os direitos reservados.


Capítulo 11
Lição 2
Implementação de métodos factory e padrões
singleton

SÍNTESE DA LIÇÃO
Esta lição explica os conceitos de métodos factory, o singleton pattern e sua implementação.

Exemplo empresarial:
Você precisa adicionar técnicas especiais de programação orientada a objetos às suas
implementações do ABAP Objects. Por esse motivo, você precisa:
● Compreensão do método factory
● Compreender o padrão singleton

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar métodos factory
● Implementar o modelo singleton

Métodos factory
A restrição da visibilidade do construtor de instância somente fará sentido se a instanciação
for feita em algum lugar da classe (ou suas subclasses, no caso de CREATE PROTECTED).
Frequentemente, tais classes fornecem um método estático público que cria uma instância
dessa classe e retorna a referência a essa instância para o chamador. Esses métodos são às
vezes chamados de métodos factory. Métodos de fábrica são executados quando uma
instância da classe é criada e tem algumas vantagens em comparação com o construtor de
instância.

Vantagens dos métodos factory

● Um método factory pode ter codificação que é executada antes da instanciação real.
Por exemplo, o método pode executar verificações, ler dados do banco de dados ou definir
bloqueios antes de criar efetivamente a instância. Se ocorrer um erro, nenhuma instância
será criada e nenhuma memória será alocada para ela.
● As classes podem ter mais de um método factory. Cada um dos métodos também pode
ter uma implementação e uma assinatura diferentes.
O método factory diferente possibilita a criação de instâncias da mesma classe com base
em informações diferentes. Por exemplo, um método factory cria uma nova instância que
oferece parâmetros de entrada para todos os atributos, enquanto outro método factory só
importa informações-chave e, em seguida, recupera os outros valores de atributo do
banco de dados.

© Direitos autorais. Todos os direitos reservados. 289


Capítulo 11 : Modelos de design orientados a objetos

● Utilizar métodos factory para administrar as instâncias de uma classe dentro da própria
classe.
A administração da instância dentro da classe é frequentemente usada para evitar a
criação de muitas instâncias idênticas. Uma referência de cada instância nova é
armazenada em um atributo estático privado da classe (uma tabela interna). Sempre que
o método factory é chamado, ele primeiro verifica se uma instância com essa chave já
existe. Em caso afirmativo, ele retorna a instância existente em vez de criar uma nova.
● Utilize um método factory para instanciar uma das subclasses em vez da própria classe.
Como exemplo, o método factory de uma classe de avião pode verificar o tipo de avião e,
em seguida, instanciar uma carga ou um avião de passageiros.

Exemplo de uma classe com método factory

Figura 172: Exemplo de uma classe com método factory

O exemplo ilustra uma classe com um método factory e utiliza um atributo estático para
referenciar todas as suas instâncias. A instanciação é restrita à classe e só é efetuada no
método estático FACTORY. Quando o método é chamado, o método factory verifica se já foi
criada uma instância idêntica. Em caso afirmativo, ele retorna a instância existente em vez de
criar uma nova.

Dica:
Neste exemplo, não é necessário tornar públicos os atributos para a instrução
READ TABLE. Como o método factory se encontra na classe, ele tem acesso
total a todos os atributos privados.

290 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de métodos factory e padrões singleton

O padrão Singleton

Figura 173: Classe singleton - utilizando um método factory

Utilize o conceito singleton para evitar que uma classe seja instanciada mais de uma vez para
o mesmo contexto de programa.
Existem várias maneiras diferentes de implementar uma classe singleton. O primeiro padrão
singleton é um caso especial do conceito de fábrica. Em vez de arquivar várias instâncias, a
classe armazena somente uma instância. Quando o método factory GET_INSTANCE é
chamado pela primeira vez, ele instancia a classe. Para cada chamada subsequente, ele
retorna a referência ao objeto existente.

© Direitos autorais. Todos os direitos reservados. 291


Capítulo 11 : Modelos de design orientados a objetos

Classe singleton - Utilizar o construtor estático

Figura 174: Classe singleton - Utilizar o construtor estático

A classe utiliza seu construtor estático para criar a instância única antecipadamente. O
método GET_INSTANCE não cria a instância, mas só retorna uma referência à instância já
existente.

Dica:
Em uma terceira variante do padrão singleton, o atributo estático GO_INSTANCE
é tornado público e somente leitura. O método GET_INSTANCE não é
necessário.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar métodos factory
● Implementar o modelo singleton

292 © Direitos autorais. Todos os direitos reservados.


Capítulo 11
Lição 3
Implementação de classes factory utilizando
amizade

SÍNTESE DA LIÇÃO
Esta lição explica o método de implementação de classes factory utilizando amizade.

Exemplo de negócio
Como desenvolvedor, crie uma classe factory para aviões usando amizade. Por esse motivo,
você precisa:
● Compreensão da definição de relações de amizade
● Compreensão de amizade e herança
● Compreensão da implementação de classes factory

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Implementar relações de amizade

Definição de relações de amizade

Figura 175: Definição de uma relação de amizade entre classes

© Direitos autorais. Todos os direitos reservados. 293


Capítulo 11 : Modelos de design orientados a objetos

Em alguns casos, as classes devem trabalhar em conjunto de forma tão próxima que uma
classe precisa de acesso às outras classes protegidas e componentes privados. Da mesma
forma, uma classe pode precisar ser capaz de criar instâncias da outra classe,
independentemente da visibilidade do construtor. Para evitar tornar essas opções disponíveis
para todos os usuários da classe, utilize o conceito de amizade de classe. Uma classe pode
conceder amizade a outras classes e interfaces e, assim, a todas as classes que
implementam a interface.
Para criar amizade, utilize o suplemento FRIENDS da instrução CLASS ou a ficha de registro
FRIENDS no Class Builder. Todas as classes e interfaces para as quais a amizade é concedida
estão listadas.
A concessão de amizade é unilateral.
Uma turma que concede amizade não é automaticamente um amigo dos amigos das aulas.
Se uma classe que concede amizade quiser acessar os componentes não públicos de um
amigo, esse amigo deve também conceder explicitamente amizade a essa classe.

Implementação de classes factory

Figura 176: Exemplo de uma classe factory

Uma aplicação típica do conceito de amigos é a definição de uma classe factory. Como o
método factory, uma classe factory cria e administra as instâncias de uma classe. Ao
terceirizar a administração para uma classe dedicada, a própria classe é mantida menor e
mais fácil de entender.
No exemplo, LCL_FACTORY serve como uma classe factory para aviões. A classe
LCL_FACTORY fornece um método público CREATE_AIRPLANE no qual CREATE_AIRPLANE
instancia a classe LCL_AIRPLANE ou retorna uma referência a uma instância já existente.
Para restringir a instância, a classe LCL_AIRPLANE é definida com a adição de CREATE
PRIVATE. Ao adicionar FRIENDS LCL_FACTORY, a amizade permite que a classe factory e
somente a classe factory criem instâncias de avião e acessem os atributos privados.

294 © Direitos autorais. Todos os direitos reservados.


Lição: Implementação de classes factory utilizando amizade

Dica:
Outra vantagem da classe factory dedicada é que se a classe tem subclasses, a
decisão sobre qual das classes deve ser instanciada poderia ser feita dentro da
classe factory em vez do programa de chamada. No exemplo, o método
CREATE_AIRPLANE poderia criar e retornar uma instância de
LCL_CARGO_PLANE ou LCL_PASSENGER_PLANE, dependendo do tipo de
plano.

Amizade e herança
O atributo amigo é herdado. Classes que herdam de amigos e interfaces contendo um amigo
como uma interface componente, também se tornam amigas. Por isso, aconselhamos que a
extrema cautela deve ser tomada ao conceder amizade. Quanto mais alto um amigo estiver
na árvore de herança, maior será o número de subclasses que podem acessar todos os
componentes de uma classe que concede amizade.
Por outro lado, a concessão de amizade não é herdada. Um amigo de uma classe superior
não é, portanto, automaticamente um amigo de suas subclasses.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Implementar relações de amizade

© Direitos autorais. Todos os direitos reservados. 295


Capítulo 11 : Modelos de design orientados a objetos

296 © Direitos autorais. Todos os direitos reservados.


Capítulo 11

Avaliação da aprendizagem

1. _____________ estático não pode ser abstrato porque não pode ser redefinido.
Escolha a resposta correta.

X A classes

X B estruturas

X C métodos

X D atributos

2. Você pode evitar que uma classe seja herdada, definindo a mesma como final.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

3. Uma associação significa que, no momento da execução, uma instância de uma classe
arquiva referências a objetos de outra classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

4. Se a visibilidade do construtor de instância for modificada de privada para protegida, a


visibilidade é ampliada para todas as suas subclasses.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

© Direitos autorais. Todos os direitos reservados. 297


Capítulo 11 : Avaliação da aprendizagem

5. Quais das seguintes opções são as vantagens de um método factory?


Escolha as respostas corretas.

X A Um método factory pode ter codificação executada antes da instanciação real.

X B Uma classe pode ter mais de um método factory com diferentes implementações
e assinaturas.

X C Os métodos factory não podem ser utilizados para administrar as instâncias de


uma classe dentro da própria classe.

X D Um método factory não pode ser utilizado para instanciar uma das subclasses em
vez da própria classe.

6. Qual dos seguintes conceitos é utilizado para fornecer um acesso de classe aos
componentes privados da outra classe?
Escolha a resposta correta.

X A Singleton

X B Amizade

X C Interface

X D Fundição

298 © Direitos autorais. Todos os direitos reservados.


Capítulo 11

Avaliação da aprendizagem - Respostas

1. _____________ estático não pode ser abstrato porque não pode ser redefinido.
Escolha a resposta correta.

X A classes

X B estruturas

X C métodos

X D atributos

Você está correto! Em uma classe abstrata, você pode definir métodos abstratos, entre
outras coisas. Isso significa que o método abstrato não pode ser implementado nessa
classe. Em vez disso, ela é implementada em uma subclasse da classe. Se a subclasse
dessa classe não for abstrata, os métodos abstratos devem ser redefinidos e
implementados na subclasse Métodos estáticos não podem ser abstratos porque não
podem ser redefinidos. Saiba mais na tarefa Classes abstratas, na lição Implementação
de técnicas avançadas orientadas a objetos, no curso BC401.

2. Você pode evitar que uma classe seja herdada, definindo a mesma como final.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Evite que uma classe seja herdada utilizando o suplemento FINAL com
a instrução de classe. Saiba mais na tarefa, Classes finais, na lição Implementação de
técnicas avançadas orientadas a objetos, no curso BC401.

© Direitos autorais. Todos os direitos reservados. 299


Capítulo 11 : Avaliação da aprendizagem - Respostas

3. Uma associação significa que, no momento da execução, uma instância de uma classe
arquiva referências a objetos de outra classe.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Associações como agregações e composições são um importante


princípio de projeto de programação orientada a objetos. Uma associação significa que,
no momento da execução, uma instância de uma classe arquiva referências a objetos de
outra classe. Saiba mais na tarefa Métodos de navegação e Chamadas de método em
cadeia, na lição Implementação de técnicas avançadas orientadas a objetos, no curso
BC401.

4. Se a visibilidade do construtor de instância for modificada de privada para protegida, a


visibilidade é ampliada para todas as suas subclasses.
Determine se esta afirmação é verdadeira ou falsa.

X Verdadeiro

X Falso

Você está correto! Se o construtor de instância estiver protegido, a visibilidade é ampliada


para todas as suas subclasses, ou seja, as subclasses também podem criar instâncias da
classe. Saiba mais na tarefa, Visibilidade do construtor de instância, na lição
Implementação de técnicas avançadas orientadas a objetos, no curso BC401.

5. Quais das seguintes opções são as vantagens de um método factory?


Escolha as respostas corretas.

X A Um método factory pode ter codificação executada antes da instanciação real.

X B Uma classe pode ter mais de um método factory com diferentes implementações
e assinaturas.

X C Os métodos factory não podem ser utilizados para administrar as instâncias de


uma classe dentro da própria classe.

X D Um método factory não pode ser utilizado para instanciar uma das subclasses em
vez da própria classe.

Você está correto! Um método factory pode ter codificação que é executada antes da
instanciação real. O método pode executar verificações, ler dados do banco de dados ou
definir bloqueios antes de criar efetivamente a instância. As classes podem ter mais de
um método factory. Cada um dos métodos também pode ter uma implementação e uma
assinatura diferentes. O método factory diferente possibilita a criação de instâncias da
mesma classe com base em informações diferentes. Leia mais na tarefa, Vantagens dos
métodos factory, na lição, Implementando o Padrão de Singleton, no curso BC401.

300 © Direitos autorais. Todos os direitos reservados.


Capítulo 11 : Avaliação da aprendizagem - Respostas

6. Qual dos seguintes conceitos é utilizado para fornecer um acesso de classe aos
componentes privados da outra classe?
Escolha a resposta correta.

X A Singleton

X B Amizade

X C Interface

X D Fundição

Você está correto! Em alguns casos, as classes devem trabalhar em conjunto de forma
tão próxima que uma classe precisa de acesso às outras classes protegidas e
componentes privados. Ou, uma classe pode precisar criar instâncias da outra classe,
independentemente da visibilidade do construtor. Neste caso, utilize o conceito de
amizade de classe. Leia mais na tarefa, Definição de relações de amizade, na lição
Implementação de classes factory utilizando a amizade, claro BC401.

© Direitos autorais. Todos os direitos reservados. 301


Capítulo 11 : Avaliação da aprendizagem - Respostas

302 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 12 Serviços de tipo em tempo de
execução

Lição 1
Utilizar identificação de tipo em tempo de execução (RTTI) 305

OBJETIVOS DO CAPÍTULO

● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução

© Direitos autorais. Todos os direitos reservados. 303


Capítulo 12 : Serviços de tipo em tempo de execução

304 © Direitos autorais. Todos os direitos reservados.


Capítulo 12
Lição 1
Utilizar identificação de tipo em tempo de
execução (RTTI)

SÍNTESE DA LIÇÃO
Esta lição descreve como implementar a identificação do tipo de tempo de execução.

Exemplo de negócio
Você quer descobrir de qual classe um determinado objeto é uma instância. Você também
quer encontrar as características de qualquer classe, interface ou tipo de dados. Por esse
motivo, você necessita dos seguintes conhecimentos:
● Compreender a identificação do tipo de tempo de execução
● Compreensão de como consultar características do tipo de estrutura no momento da
execução

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução

© Direitos autorais. Todos os direitos reservados. 305


Capítulo 12 : Serviços de tipo em tempo de execução

RTTI

Figura 177: Análise dinâmica de tipo com classes RTTI

Desde a introdução do ABAP Objects, um conceito baseado em classe foi desenvolvido,


chamado Run Time Type Identification (RTTI). RTTI determina atributos de tipo no momento
da execução. RTTI inclui todos os tipos ABAP e abrange todas as funções das instruções
agora obsoletas DESCRIBE FIELD e DESCRIBE TABLE. RTTI inclui uma classe de descrição
para cada tipo com atributos especiais para atributos de tipo especiais.
A hierarquia de classes das classes de descrição corresponde à hierarquia de tipos em ABAP
Objects. Além disso, as classes de descrição para tipos complexos, referências, classes e
interfaces têm métodos especiais que você pode utilizar para indicar referências a subtipos.
Você pode utilizar esses métodos para navegar pelo tipo composto para todos os seus
subtipos.

306 © Direitos autorais. Todos os direitos reservados.


Lição: Utilizar identificação de tipo em tempo de execução (RTTI)

RTTI – Métodos e atributos da classe raiz

Figura 178: RTTI – Métodos e atributos da classe raiz

Para obter uma referência a um objeto de descrição de um tipo, utilize os métodos estáticos
da classe CL_ABAP_TYPEDESCR ou os métodos de navegação da classe de descrição
especial. Os objetos de descrição são então criados a partir de uma das subclasses. em
tempo de processamento, existe exatamente um objeto de descrição para cada tipo. Os
atributos do objeto de descrição contêm informações sobre os atributos do tipo.

© Direitos autorais. Todos os direitos reservados. 307


Capítulo 12 : Serviços de tipo em tempo de execução

Descrições RTTI do tipo estruturado

Figura 179: RTTI – Consulta de atributos de estrutura

O exemplo na figura RTTI – Consultando atributos de estrutura mostra como identificar os


atributos de uma estrutura utilizando a subclasse CL_ABAP_STRUCTDESCR de RTTI.
Para identificar os atributos de uma estrutura, primeiro definimos uma referência à classe de
descrição apropriada. A classe de descrição tem um atributo COMPONENTS que você pode
utilizar para descrever os componentes da estrutura relevante. Uma vez que o atributo
COMPONENTS é uma tabela interna, você também precisa definir uma área de trabalho com
um tipo de linha compatível.
A chamada do método funcional fornece a referência à instância de descrição da estrutura
que você quer consultar.
A classe abstrata CL_ABAP_TYPEDESCR contém o método estático DESCRIBE_BY_DATA.
Seu parâmetro de retorno está tipificado como uma referência a essa classe superior.
Contudo, uma vez que o parâmetro real é uma referência à subclasse
CL_ABAP_STRUCTDESCR, você precisa atribuir o objeto utilizando um down-cast.
Você pode acessar os atributos da instância de descrição de qualquer modo. Neste exemplo,
o programa exibe os nomes dos componentes como títulos de coluna. (Para maior clareza,
omitimos as opções de formatação.)

308 © Direitos autorais. Todos os direitos reservados.


Lição: Utilizar identificação de tipo em tempo de execução (RTTI)

Descrições RTTI do tipo de objeto

Figura 180: RTTI – Consulta de atributos de tipo de objeto

Em nosso exemplo de negócios anterior com a agência de viagens e seu parceiro de negócios,
especificamos que uma instância da classe de locação de veículos (LCL_RENTAL) reage a um
evento incluindo a instância de veículo que acionou o evento em uma lista. As instâncias
acionadoras incluem ônibus (LCL_BUS) e caminhões (LCL_TRUCK).
Para estender o exemplo, suponha que a locadora de veículos esteja interessada apenas em
ônibus. O parâmetro SENDER do método de manipulador de eventos contém a referência à
instância de veículo acionador. Seu tipo de objeto dinâmico deve ser analisado para
determinar se o veículo em questão é um ônibus ou um caminhão.
A chamada do método RTTI funcional retorna a referência à instância de descrição da
instância de veículo transferida.
A classe abstrata CL_ABAP_TYPEDESCR tem o método DESCRIBE_BY_OBJECT_ REF. Você
digita o parâmetro de retorno DESCRIBE_BY_OBJECT_REF como referência a
CL_ABAP_TYPEDESCR. No entanto, uma vez que você digita o parâmetro real GO_DESCR na
subclasse CL_ABAP_CLASSDESCR, você precisa atribuir o objeto utilizando um down-cast.
Agora, você pode acessar os atributos da instância de descrição de qualquer forma. O
método funcional GET_RELATIVE_NAME fornece o nome da classe.

© Direitos autorais. Todos os direitos reservados. 309


Capítulo 12 : Serviços de tipo em tempo de execução

Nota:
É possível consultar atributos de tipo de objeto no tempo de execução sem utilizar
classes RTTI. Por exemplo, você pode utilizar uma atribuição down-cast de
SENDER para uma variável de referência que tem um tipo estático LCL_BUS. Isso
resulta em um erro em tempo de execução para instâncias de veículo que não são
ônibus. Em seguida, você pode detectar este erro em tempo de execução. Neste
caso, o fato de não ter sido acionado um erro em tempo de execução é o critério
para incluir um veículo na lista de veículos.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar RTTI
● Descrever características do tipo de estrutura no momento da execução
● Descrever características do tipo de objeto no momento da execução

310 © Direitos autorais. Todos os direitos reservados.


Capítulo 12

Avaliação da aprendizagem

1. Qual das seguintes classes é utilizada para identificar os atributos de uma estrutura
usando a identificação do tipo em tempo de execução?
Escolha a resposta correta.

X A CL_ABAP_TYPEDESCR

X B CL_ABAP_STRUCTDESCR

X C CL_ABAP_OBJECTDESCR

X D CL_ABAP_CLASSDESCR

2. Qual dos seguintes atributos de CL_ABAP_STRUCTDESCR é utilizado para descrever os


componentes individuais de qualquer estrutura relevante?
Escolha a resposta correta.

X A COMPONENTES

X B TYPE_KIND

X C LENGTH

X D DECIMALS

© Direitos autorais. Todos os direitos reservados. 311


Capítulo 12

Avaliação da aprendizagem - Respostas

1. Qual das seguintes classes é utilizada para identificar os atributos de uma estrutura
usando a identificação do tipo em tempo de execução?
Escolha a resposta correta.

X A CL_ABAP_TYPEDESCR

X B CL_ABAP_STRUCTDESCR

X C CL_ABAP_OBJECTDESCR

X D CL_ABAP_CLASSDESCR

Você está correto! Você pode identificar os atributos de uma estrutura utilizando a
subclasse CL_ABAP_STRUCTDESCR de RTTI. Leia mais na tarefa Descrições de RTTI de
tipo estruturado, na lição Utilização de identificação de tipo em tempo de execução
(RTTI), no curso BC401.

2. Qual dos seguintes atributos de CL_ABAP_STRUCTDESCR é utilizado para descrever os


componentes individuais de qualquer estrutura relevante?
Escolha a resposta correta.

X A COMPONENTES

X B TYPE_KIND

X C LENGTH

X D DECIMALS

Você está correto! A classe CL_ABAP_STRUCTDESCR tem um atributo COMPONENTS


que você pode utilizar para descrever os componentes da estrutura relevante. Leia mais
na tarefa Descrições de RTTI de tipo estruturado, na lição Utilização de identificação de
tipo em tempo de execução (RTTI), no curso BC401.

312 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 13 Objetos persistentes e
transações OO

Lição 1
Implementar objetos persistentes 315

OBJETIVOS DO CAPÍTULO

● Explicar serviços de persistência


● Examinar classes persistentes
● Criar objetos persistentes
● Ler dados com objetos persistentes
● Criar transações OO

© Direitos autorais. Todos os direitos reservados. 313


Capítulo 13 : Objetos persistentes e transações OO

314 © Direitos autorais. Todos os direitos reservados.


Capítulo 13
Lição 1
Implementar objetos persistentes

SÍNTESE DA LIÇÃO
Esta lição mostra como implementar objetos persistentes.

Exemplo de negócio
Você precisa utilizar Objetos persistentes para acessar suas tabelas de banco de dados e
também transações orientadas a objetos (OO) em seus programas ABAP Objects. Por esse
motivo, você precisa:
● Compreensão dos serviços de persistência
● Compreensão de classes persistentes
● Compreensão de como criar objetos persistentes
● Compreensão de como ler dados com objetos persistentes
● Compreensão de como criar transações OO

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Explicar serviços de persistência
● Examinar classes persistentes
● Criar objetos persistentes
● Ler dados com objetos persistentes
● Criar transações OO

© Direitos autorais. Todos os direitos reservados. 315


Capítulo 13 : Objetos persistentes e transações OO

Serviços persistentes

Figura 181: Simulação de um sistema de administração de bancos de dados orientado a objetos

Em princípio, os programas ABAP trabalham com dados e objetos que só são válidos no
momento da execução. Os dados e objetos utilizados em programas ABAP são transientes.
Os dados na memória são temporários e desaparecem quando o programa termina. Para
armazenar os dados permanentemente e independentemente do programa, você deve
armazená-los em um banco de dados. Teoricamente, você também pode utilizar arquivos no
nível do sistema operacional.
Para isso, os serviços de persistência para ABAP Objects foram introduzidos no SAP
NetWeaver Application Server (SAP NetWeaver AS). Mediante solicitação, o desenvolvedor
ABAP pode utilizar estes serviços e escrever os valores de atributo atuais de objetos como
persistentes nas tabelas transparentes associadas. Para ler os valores das tabelas, os
serviços persistentes podem ser utilizados para importar os valores para um objeto
previamente definido como persistente. Ao fazer isso, os serviços de persistência utilizam a
interface ABAP Open SQL.
Você utilizará os serviços de persistência com técnicas de programação orientadas a objetos.
Assim, você pode simular um sistema de administração de bancos de dados orientado a
objetos, através de um sistema de administração de bancos de dados relacionais e do ABAP
Objects.

Classes persistentes
Para utilizar o serviço de persistência para objetos, você deve criar os respectivos tipos como
classes persistentes no Class Builder. O termo classe persistente indica que o serviço de
persistência administra as instâncias da classe e seu estado. (As classes globais são
geralmente persistentes. A questão é se suas instâncias são ou não igualmente persistentes.)

316 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar objetos persistentes

Para garantir que as instâncias de classes persistentes são únicas, elas devem conter
atributos-chave. Você pode tipificá-los como números de identificação unívocos globais
(GUID do objeto) ou chaves semânticas.
Quando você cria uma classe persistente ZCL_<nome>, o Class Builder gera
automaticamente métodos para obter e definir os respectivos atributos. Além disso, o
sistema também gera outros objetos do repositório, incluindo o ator de classe (também
conhecido como agente de classe) ZCA_<nome>. Os programas devem chamar os métodos
dessa classe para administrar as instâncias de classes persistentes, ou seja, objetos
persistentes. O ator de classe também executa o acesso real ao banco de dados. Ele herda
automaticamente os métodos necessários da classe de base ZCB_<nome>. Você pode
redefinir esses métodos, se necessário. Por exemplo, ampliar acessos ao banco de dados. O
autor de classe é uma instância singleton e tem uma relação de amizade com a classe
persistente.

Criação de objetos persistentes

Figura 182: Geração e escrita de objetos persistentes

No programa, você precisa definir uma variável de referência com o tipo do autor de classe e
preenchê-la com a referência do atributo estático AGENT. Então você pode criar uma nova
instância da classe persistente, utilizando o método CREATE_PERSISTENT. O desenvolvedor
ABAP cria sua interface a partir da definição dos atributos chave da classe persistente. Se já
existir um objeto persistente da mesma classe de persistência com os mesmos atributos de
chave no programa, é acionada a exceção baseada na classe CX_OS_OBJECT_EXISTING. Por
padrão, os dados são gravados por uma atualização assíncrona. Você deve iniciar este
processo utilizando a instrução COMMIT WORK. Assim, as instâncias da classe persistente só
se tornam objetos persistentes após esse momento.

© Direitos autorais. Todos os direitos reservados. 317


Capítulo 13 : Objetos persistentes e transações OO

Acesso a objetos persistentes

Figura 183: Leitura de objetos persistentes

Você pode carregar um objeto persistente individual de volta para um programa utilizando o
método GET_PERSISTENT. Ao fazer isso, você deve transferir os valores-chave para os
parâmetros da interface para que você possa restaurar o objeto de forma única. Se o
programa não encontrar o objeto, ele aciona a exceção baseada na classe
CX_OS_OBJECT_NOT_FOUND.
Você pode recuperar um conjunto maior de objetos persistentes utilizando o serviço de
consulta. É possível fornecer uma seleção, tal como a cláusula WHERE de uma instrução
SELECT, bem como os critérios de ordenação.

Para criar classes persistentes

1. Modele a classe para seus objetos persistentes.

2. Procure ou crie uma tabela transparente adequada que tenha um campo para cada
atributo da classe. Se necessário, ajuste os atributos da classe para que correspondam
aos atributos de campo técnicos da tabela transparente.

Nota:
Deve existir um campo-chave primário na tabela para cada atributo-chave da
classe ou deve existir um atributo-chave da classe para cada campo-chave
primário na tabela.

3. No Class Builder, crie uma classe persistente como descrito na biblioteca SAP. Defina o
mapeamento de persistência para a tabela.

318 © Direitos autorais. Todos os direitos reservados.


Lição: Implementar objetos persistentes

Transação OO

Figura 184: Criação de um código de transação OO

Na atualização de transações, você pode criar o código de transação como uma transação
OO. Isso significa que você liga o código de transação ao serviço de transação do ABAP
Objects Services para objetos persistentes ou a um método público em uma classe global ou
local de um programa. Ao chamar este tipo de transação OO, que está ligado a um método de
instância, o sistema cria automaticamente uma instância da classe em sua própria sessão
interna e, em seguida, executa esse método de instância.

Cuidado:
Você ainda necessita de programas básicos de procedimento para campos de
tela.

Se o código Modelo de transação OO estiver definido, o sistema liga o código de transação ao


serviço de transações dos ABAP Objects Services. Por outro lado, se não estiver definido,
você pode chamar qualquer método em uma classe global ou local.
Por isso, os usuários têm agora a oportunidade de chamar os próprios métodos da forma
habitual (utilizando opções de menu, entradas de campo de comando, etc.).

© Direitos autorais. Todos os direitos reservados. 319


Capítulo 13 : Objetos persistentes e transações OO

Cuidado:
As classes globais em ABAP Objects não podem conter definições de tela.
Por isso, ao criar uma ligação a uma classe global, considere os seguintes
pontos:
● O construtor não pode conter parâmetros IMPORTING.
● Você não pode processar exibições de lista ABAP.

A quebra dessas regras não causará um erro de sintaxe ou uma mensagem da Verificação
ampliada de sintaxe. Em vez disso, você causará um erro em tempo de execução ou não
haverá exibição
Por isso, você pode ter que recorrer à utilização de métodos em classes de programa locais.
Naturalmente, você pode utilizar todas as técnicas convencionais de programação em
diálogo.

Para criar transações OO


Você pode criar uma transação OO utilizando as seguintes etapas:

1. Na caixa de diálogo Criar transação, insira uma descrição no campo Texto breve.

2. Selecione a opção Método de uma classe (transação OO) como um Objeto inicial.

3. Se você quiser ligar o código de transação a um método de instância normal, deixe o


campo de seleção Modelo de transação OO desmarcado.

4. Insira o Nome da classe e o Método. Se você estiver utilizando uma classe local, marque o
campo de seleção Local no programa e insira o nome do programa.

5. Grave o código de transação.

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Explicar serviços de persistência
● Examinar classes persistentes
● Criar objetos persistentes
● Ler dados com objetos persistentes
● Criar transações OO

320 © Direitos autorais. Todos os direitos reservados.


Capítulo 13

Avaliação da aprendizagem

1. O que você deve fazer para utilizar o serviço de persistência para objetos?
Escolha a resposta correta.

X A Você deve digitá-lo como um GUID de objeto.

X B Você deve digitá-lo como uma chave semântica.

X C Você deve criar os respectivos tipos como classes persistentes no Class Builder.

2. Que exceção baseada na classe é acionada se já existir um objeto persistente da mesma


classe persistente com os mesmos atributos de chave no programa?
Escolha a resposta correta.

X A CX_SY_ZERODIVIDE

X B CX_SY_MOVE_CAST_ERROR

X C CX_OS_OBJECT_EXISTING

X D CX_ROOT

3. Como você pode criar uma nova instância de uma classe persistente?
Escolha a resposta correta.

X A Utilizando o método CREATE_PERSISTENT do agente de classe

X B Usando o atributo AGENT

X C Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X D Utilizando a instrução COMMIT WORK

© Direitos autorais. Todos os direitos reservados. 321


Capítulo 13 : Avaliação da aprendizagem

4. Como você pode carregar um único objeto persistente de volta para um programa?
Escolha a resposta correta.

X A Utilizando o método CREATE_PERSISTENT

X B Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X C Utilizando o serviço de consulta

X D Utilizando o método GET_PERSISTENT

5. Como você pode recuperar um conjunto maior de objetos persistentes?


Escolha a resposta correta.

X A Utilizando o serviço de consulta

X B Utilizando o método CREATE_PERSISTENT

X C Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X D Utilizando o método GET_PERSISTENT

322 © Direitos autorais. Todos os direitos reservados.


Capítulo 13

Avaliação da aprendizagem - Respostas

1. O que você deve fazer para utilizar o serviço de persistência para objetos?
Escolha a resposta correta.

X A Você deve digitá-lo como um GUID de objeto.

X B Você deve digitá-lo como uma chave semântica.

X C Você deve criar os respectivos tipos como classes persistentes no Class Builder.

Você está correto! Para utilizar o serviço de persistência para objetos, você deve criar os
respectivos tipos como classes persistentes no Class Builder. O termo classe persistente
indica que o serviço de persistência administra as instâncias da classe e seu estado. Saiba
mais na tarefa Serviços de persistência, na lição Implementação de objetos persistentes,
do curso BC401.

2. Que exceção baseada na classe é acionada se já existir um objeto persistente da mesma


classe persistente com os mesmos atributos de chave no programa?
Escolha a resposta correta.

X A CX_SY_ZERODIVIDE

X B CX_SY_MOVE_CAST_ERROR

X C CX_OS_OBJECT_EXISTING

X D CX_ROOT

Você está correto! Se já existir um objeto persistente da mesma classe de persistência


com os mesmos atributos de chave no programa, é acionada a exceção baseada na classe
CX_OS_OBJECT_EXISTING. Saiba mais na tarefa Criação de objetos persistentes na lição
Implementação de objetos persistentes do curso BC401.

© Direitos autorais. Todos os direitos reservados. 323


Capítulo 13 : Avaliação da aprendizagem - Respostas

3. Como você pode criar uma nova instância de uma classe persistente?
Escolha a resposta correta.

X A Utilizando o método CREATE_PERSISTENT do agente de classe

X B Usando o atributo AGENT

X C Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X D Utilizando a instrução COMMIT WORK

Você está correto! No programa, você precisa definir uma variável de referência com o
tipo do autor de classe e preenchê-la com a referência do atributo estático AGENT. Então
você pode criar uma nova instância da classe persistente, utilizando o método
CREATE_PERSISTENT. Saiba mais na tarefa Criação de objetos persistentes na lição
Implementação de objetos persistentes do curso BC401.

4. Como você pode carregar um único objeto persistente de volta para um programa?
Escolha a resposta correta.

X A Utilizando o método CREATE_PERSISTENT

X B Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X C Utilizando o serviço de consulta

X D Utilizando o método GET_PERSISTENT

Você está correto! Você pode carregar um objeto persistente individual de volta para um
programa utilizando o método GET_PERSISTENT. Ao fazer isso, você deve transferir os
valores-chave para os parâmetros da interface para que você possa restaurar o objeto de
forma única. Saiba mais na tarefa Acesso a objetos persistentes na lição Implementação
de objetos persistentes do curso BC401.

5. Como você pode recuperar um conjunto maior de objetos persistentes?


Escolha a resposta correta.

X A Utilizando o serviço de consulta

X B Utilizando o método CREATE_PERSISTENT

X C Utilizando a exceção baseada na classe CX_OS_OBJECT_EXISTING

X D Utilizando o método GET_PERSISTENT

Você está correto! Você pode recuperar um conjunto maior de objetos persistentes
utilizando o serviço de consulta. É possível fornecer uma seleção, tal como a cláusula
WHERE de uma instrução SELECT, bem como os critérios de ordenação. Saiba mais na
tarefa Acesso a objetos persistentes na lição Implementação de objetos persistentes do
curso BC401.

324 © Direitos autorais. Todos os direitos reservados.


CAPÍTULO 14 Criação de uma aplicação
abrangente orientada a objetos

Lição 1
Desenvolvimento de uma aplicação abrangente orientada a objetos 327

OBJETIVOS DO CAPÍTULO

● Desenvolver uma aplicação abrangente orientada a objetos

© Direitos autorais. Todos os direitos reservados. 325


Capítulo 14 : Criação de uma aplicação abrangente orientada a objetos

326 © Direitos autorais. Todos os direitos reservados.


Capítulo 14
Lição 1
Desenvolvimento de uma aplicação
abrangente orientada a objetos

SÍNTESE DA LIÇÃO
Esta lição explica as formas de aplicar as técnicas do ABAP Objects ao estudo de caso.

Exemplo de negócio
Um cliente deve reservar um voo em uma agência de viagens, mas o voo já está totalmente
reservado. Contudo, é dada ao cliente a opção de se registrar no voo e de ser colocado em
lista de espera. Por esse motivo, você precisa:
● Compreender os diagramas de UML
● Compreensão da programação orientada a objetos

OBJETIVOS DA LIÇÃO
Após a conclusão desta lição, você estará apto a:
● Desenvolver uma aplicação abrangente orientada a objetos

Requisitos de um estudo de caso orientado a objetos

Figura 185: Estudo de caso – Requisitos I

© Direitos autorais. Todos os direitos reservados. 327


Capítulo 14 : Criação de uma aplicação abrangente orientada a objetos

Utilizando o programa ABAP Objects, você precisa implementar o diagrama de classes no


modelo e poder atualizar uma lista de espera para cada voo. É possível atualizar uma lista de
espera para cada linha de voo da tabela SFLIGHT com a chave CARRID, CONNID e FLDATE.

Nota:
O modelo mostrado na figura é uma possível solução para os requisitos de lista de
espera descritos. Os participantes do curso podem utilizar seu próprio diagrama
de classe UML, que produz uma solução diferente.

Todas as listas de espera devem ser arquivadas em um buffer de listas de espera chamado
WAIT_LIST, que é tecnicamente uma tabela interna. Além dos dados do voo, as listas de
espera devem conter uma lista de todos os clientes que se registraram para este voo. As
funções desse aplicativo são mostradas na figura.

Estudo de caso – Requisitos II

Figura 186: Estudo de caso – Requisitos II

A tela e as funções exibidas devem ser criadas de acordo com as especificações de


requisitos. A estrutura da tela e a lógica de processamento já estão disponíveis. Você deve
agora implementar o processamento real, ou seja, a inteligência do programa, usando
técnicas orientadas a objetos.

Funções de botões

Tabela 5: Funções de botões

A tabela a seguir lista as funções dos botões usados no estudo de caso:

328 © Direitos autorais. Todos os direitos reservados.


Lição: Desenvolvimento de uma aplicação abrangente orientada a objetos

Botão Funções
Exibir Exibe a lista de espera para o voo indicado (CARRID,
CONNID, FLDATE)
Criar Cria a lista de espera para o voo indicado (CARRID,
CONNID, FLDATE)
Excluir Elimina a lista de espera para o voo indicado (CAR-
RID, CONNID, FLDATE)
Adicionar Adiciona o cliente selecionado no lado direito da tela
à lista de espera de voo selecionada no lado esquer-
do
Eliminar (cliente) Elimina o cliente selecionado no lado direito da tela
do voo exibido no lado esquerdo
Posição Exibe a posição do cliente selecionado na lista de es-
pera
Tipo de cliente Mostra se o cliente selecionado é um cliente particu-
lar ou um cliente empresarial (você encontrará as in-
formações relevantes no campo CUSTTYPE da tabe-
la SCUSTOM)
Exibir clientes movidos para cima Exibe todos os clientes da lista que foram movidos
com êxito para cima, na lista de espera, para recebe-
rem um assento no voo
Log de status Exibe o número de clientes da lista que obtiveram
êxito ao obter um assento em um voo

RESUMO DA LIÇÃO
Você agora deve estar apto a:
● Desenvolver uma aplicação abrangente orientada a objetos

© Direitos autorais. Todos os direitos reservados. 329


Capítulo 14 : Criação de uma aplicação abrangente orientada a objetos

330 © Direitos autorais. Todos os direitos reservados.


Capítulo 14

Avaliação da aprendizagem

1. No estudo de caso, quando usamos uma classe para definir o buffer para as listas de
espera de todos os voos, qual conceito estamos implementando?
Escolha a resposta correta.

X A Classe superior

X B Classe Singleton

X C Subclasse

X D Amigos

© Direitos autorais. Todos os direitos reservados. 331


Capítulo 14

Avaliação da aprendizagem - Respostas

1. No estudo de caso, quando usamos uma classe para definir o buffer para as listas de
espera de todos os voos, qual conceito estamos implementando?
Escolha a resposta correta.

X A Classe superior

X B Classe Singleton

X C Subclasse

X D Amigos

Você está correto! Você pode simplesmente definir o buffer para as listas de espera no
programa principal como uma tabela interna normal. Contudo, você quer utilizar uma
classe, neste caso, e por isso, o conceito singleton é utilizado. Saiba mais na tarefa
Requisitos de um estudo de caso orientado a objetos, na lição Desenvolvimento de uma
aplicação abrangente orientada a objetos, no curso BC401.

332 © Direitos autorais. Todos os direitos reservados.

Você também pode gostar