SAP ABAP - Polimorfismo

O termo polimorfismo significa literalmente 'muitas formas'. De uma perspectiva orientada a objetos, o polimorfismo funciona em conjunto com a herança para possibilitar que vários tipos dentro de uma árvore de herança sejam usados ​​alternadamente. Ou seja, o polimorfismo ocorre quando existe uma hierarquia de classes e elas são relacionadas por herança. Polimorfismo ABAP significa que uma chamada a um método fará com que um método diferente seja executado, dependendo do tipo de objeto que invoca o método.

O programa a seguir contém uma classe abstrata 'class_prgm', 2 subclasses (class_procedural e class_OO) e uma classe de driver de teste 'class_type_approach'. Nesta implementação, o método de classe 'start' nos permite exibir o tipo de programação e sua abordagem. Se você observar atentamente a assinatura do método 'start', verá que ele recebe um parâmetro de importação do tipo class_prgm. No entanto, no evento Start-Of-Selection, esse método foi chamado em tempo de execução com objetos do tipo class_procedural e class_OO.

Exemplo

Report ZPolymorphism1. 
CLASS class_prgm Definition Abstract. 
PUBLIC Section. 
Methods: prgm_type Abstract, 
approach1 Abstract. 
ENDCLASS. 

CLASS class_procedural Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_procedural Implementation. 
Method prgm_type. 
Write: 'Procedural programming'. 

EndMethod. Method approach1. 
Write: 'top-down approach'. 

EndMethod. ENDCLASS. 
CLASS class_OO Definition 
Inheriting From class_prgm. 
PUBLIC Section. 
Methods: prgm_type Redefinition, 
approach1 Redefinition. 
ENDCLASS. 

CLASS class_OO Implementation. 
Method prgm_type. 
Write: 'Object oriented programming'. 
EndMethod. 

Method approach1. 
Write: 'bottom-up approach'.
EndMethod. 
ENDCLASS. 

CLASS class_type_approach Definition. 
PUBLIC Section. 
CLASS-METHODS: 
start Importing class1_prgm 
Type Ref To class_prgm. 
ENDCLASS. 

CLASS class_type_approach IMPLEMENTATION. 
Method start. 
CALL Method class1_prgm→prgm_type. 
Write: 'follows'. 

CALL Method class1_prgm→approach1. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Data: class_1 Type Ref To class_procedural, 
class_2 Type Ref To class_OO. 

Create Object class_1. 
Create Object class_2. 
CALL Method class_type_approach⇒start 
Exporting 

class1_prgm = class_1. 
New-Line. 
CALL Method class_type_approach⇒start 
Exporting 
class1_prgm = class_2.

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

Procedural programming follows top-down approach  
Object oriented programming follows bottom-up approach

O ambiente de tempo de execução ABAP executa uma conversão implícita de estreitamento durante a atribuição do parâmetro de importação class1_prgm. Este recurso ajuda o método 'start' a ser implementado genericamente. As informações de tipo dinâmico associadas a uma variável de referência de objeto permitem que o ambiente de tempo de execução ABAP vincule dinamicamente uma chamada de método com a implementação definida no objeto apontado pela variável de referência de objeto. Por exemplo, o parâmetro de importação 'class1_prgm' para o método 'start' na classe 'class_type_approach' refere-se a um tipo abstrato que nunca poderia ser instanciado por conta própria.

Sempre que o método é chamado com uma implementação de subclasse concreta, como class_procedural ou class_OO, o tipo dinâmico do parâmetro de referência class1_prgm é vinculado a um desses tipos concretos. Portanto, as chamadas aos métodos 'prgm_type' e 'approach1' referem-se às implementações fornecidas nas subclasses class_procedural ou class_OO em vez das implementações abstratas indefinidas fornecidas na classe 'class_prgm'.