SAP ABAP - Polimorfismo
Il termine polimorfismo significa letteralmente "molte forme". Da una prospettiva orientata agli oggetti, il polimorfismo funziona insieme all'ereditarietà per rendere possibile l'uso intercambiabile di vari tipi all'interno di un albero dell'ereditarietà. Cioè, il polimorfismo si verifica quando esiste una gerarchia di classi e sono correlate per ereditarietà. Il polimorfismo ABAP significa che una chiamata a un metodo provocherà l'esecuzione di un metodo diverso a seconda del tipo di oggetto che richiama il metodo.
Il seguente programma contiene una classe astratta "class_prgm", 2 sottoclassi (class_procedural e class_OO) e una classe di driver di test "class_type_approach". In questa implementazione, il metodo di classe "start" ci consente di visualizzare il tipo di programmazione e il suo approccio. Se osservi attentamente la firma del metodo "start", noterai che riceve un parametro di importazione di tipo class_prgm. Tuttavia, nell'evento Start-Of-Selection, questo metodo è stato chiamato in fase di esecuzione con oggetti di tipo class_procedural e class_OO.
Esempio
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.
Il codice precedente produce il seguente output:
Procedural programming follows top-down approach
Object oriented programming follows bottom-up approach
L'ambiente run-time ABAP esegue un cast di restringimento implicito durante l'assegnazione del parametro di importazione class1_prgm. Questa funzione aiuta a implementare genericamente il metodo "start". Le informazioni sul tipo dinamico associate a una variabile di riferimento oggetto consentono all'ambiente run-time ABAP di associare dinamicamente una chiamata al metodo con l'implementazione definita nell'oggetto a cui punta la variabile di riferimento oggetto. Ad esempio, il parametro di importazione "class1_prgm" per il metodo "start" nella classe "class_type_approach" si riferisce a un tipo astratto che non potrebbe mai essere istanziato da solo.
Ogni volta che il metodo viene chiamato con un'implementazione di una sottoclasse concreta come class_procedural o class_OO, il tipo dinamico del parametro di riferimento class1_prgm è associato a uno di questi tipi concreti. Pertanto, le chiamate ai metodi 'prgm_type' e 'approach1' si riferiscono alle implementazioni fornite nelle sottoclassi class_procedural o class_OO piuttosto che alle implementazioni astratte non definite fornite nella classe 'class_prgm'.