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'.