SAP ABAP - Polymorphisme

Le terme polymorphisme signifie littéralement «de nombreuses formes». D'un point de vue orienté objet, le polymorphisme fonctionne en conjonction avec l'héritage pour permettre à différents types dans un arbre d'héritage d'être utilisés de manière interchangeable. Autrement dit, le polymorphisme se produit lorsqu'il existe une hiérarchie de classes et qu'elles sont liées par héritage. Le polymorphisme ABAP signifie qu'un appel à une méthode entraînera l'exécution d'une méthode différente en fonction du type d'objet qui invoque la méthode.

Le programme suivant contient une classe abstraite 'class_prgm', 2 sous-classes (class_procedural et class_OO) et une classe de pilote de test 'class_type_approach'. Dans cette implémentation, la méthode de classe 'start' nous permet d'afficher le type de programmation et son approche. Si vous regardez attentivement la signature de la méthode 'start', vous observerez qu'elle reçoit un paramètre d'importation de type class_prgm. Cependant, dans l'événement Start-Of-Selection, cette méthode a été appelée au moment de l'exécution avec des objets de type class_procedural et class_OO.

Exemple

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.

Le code ci-dessus produit la sortie suivante -

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

L'environnement d'exécution ABAP effectue une conversion de restriction implicite lors de l'affectation du paramètre d'importation class1_prgm. Cette fonction aide la méthode «start» à être implémentée de manière générique. Les informations de type dynamique associées à une variable de référence d'objet permettent à l'environnement d'exécution ABAP de lier dynamiquement un appel de méthode à l'implémentation définie dans l'objet pointé par la variable de référence d'objet. Par exemple, le paramètre d'importation «class1_prgm» pour la méthode «start» dans la classe «class_type_approach» fait référence à un type abstrait qui ne pourrait jamais être instancié seul.

Chaque fois que la méthode est appelée avec une implémentation de sous-classe concrète telle que class_procedural ou class_OO, le type dynamique du paramètre de référence class1_prgm est lié à l'un de ces types concrets. Par conséquent, les appels aux méthodes 'prgm_type' et 'approach1' se réfèrent aux implémentations fournies dans les sous-classes class_procedural ou class_OO plutôt qu'aux implémentations abstraites non définies fournies dans la classe 'class_prgm'.