SAP ABAP - Herança

Um dos conceitos mais importantes na programação orientada a objetos é o de herança. A herança nos permite definir uma classe em termos de outra classe, o que torna mais fácil criar e manter um aplicativo. Isso também oferece uma oportunidade de reutilizar a funcionalidade do código e tempo de implementação rápido.

Ao criar uma classe, em vez de escrever membros de dados e métodos completamente novos, o programador pode designar que a nova classe deve herdar os membros de uma classe existente. Esta classe existente é chamada debase class ou super class, e a nova classe é chamada de derived class ou sub class.

  • Um objeto de uma classe pode adquirir as propriedades de outra classe.

  • A classe derivada herda os dados e métodos de uma superclasse. No entanto, eles podem substituir métodos e também adicionar novos métodos.

  • A principal vantagem da herança é a reutilização.

O relacionamento de herança é especificado usando a adição 'INHERITING FROM' à instrução de definição de classe.

A seguir está a sintaxe -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Exemplo

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

O código acima produz a seguinte saída -

This is public data 
Method in child class 
This is public data

Controle de acesso e herança

Uma classe derivada pode acessar todos os membros não privados de sua classe base. Assim, os membros da superclasse que não devem ser acessíveis às funções de membro das subclasses devem ser declarados privados na superclasse. Podemos resumir os diferentes tipos de acesso de acordo com quem pode acessá-los da seguinte maneira -

Acesso Público Protegido Privado
Mesmos calss sim sim sim
Classe derivada sim sim Não
Fora da aula sim Não Não

Ao derivar uma classe de uma superclasse, ela pode ser herdada por herança pública, protegida ou privada. O tipo de herança é especificado pelo especificador de acesso conforme explicado acima. Dificilmente usamos herança protegida ou privada, mas herança pública é comumente usada. As seguintes regras são aplicadas ao usar diferentes tipos de herança.

  • Public Inheritance- Ao derivar uma classe de uma superclasse pública, os membros públicos da superclasse se tornam membros públicos da subclasse e os membros protegidos da superclasse se tornam membros protegidos da subclasse. Os membros privados da superclasse nunca estão acessíveis diretamente de uma subclasse, mas podem ser acessados ​​por meio de chamadas para os membros públicos e protegidos da superclasse.

  • Protected Inheritance - Ao derivar de uma superclasse protegida, os membros públicos e protegidos da superclasse tornam-se membros protegidos da subclasse.

  • Private Inheritance - Ao derivar de uma superclasse privada, os membros públicos e protegidos da superclasse tornam-se membros privados da subclasse.

Redefinindo métodos na subclasse

Os métodos da superclasse podem ser reimplementados na subclasse. Algumas regras de redefinição de métodos -

  • A instrução de redefinição para o método herdado deve estar na mesma seção que a definição do método original.

  • Se você redefinir um método, não precisa inserir sua interface novamente na subclasse, mas apenas o nome do método.

  • Dentro do método redefinido, você pode acessar componentes da superclasse direta usando a super referência.

  • A pseudo referência super só pode ser usada em métodos redefinidos.

Exemplo

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

Depois de executar F8, se inserirmos os valores 9 e 10, o código acima produzirá a seguinte saída -

Redefinition Demo 
29