SAPABAP-ポリモーフィズム

ポリモーフィズムという用語は、文字通り「多くの形式」を意味します。オブジェクト指向の観点からは、ポリモーフィズムは継承と連携して機能し、継承ツリー内のさまざまなタイプを交換可能に使用できるようにします。つまり、ポリモーフィズムは、クラスの階層があり、それらが継承によって関連付けられている場合に発生します。ABAPポリモーフィズムとは、メソッドを呼び出すと、そのメソッドを呼び出すオブジェクトのタイプに応じて、異なるメソッドが実行されることを意味します。

次のプログラムには、抽象クラス 'class_prgm'、2つのサブクラス(class_proceduralおよびclass_OO)、およびテストドライバークラス 'class_type_approach'が含まれています。この実装では、クラスメソッド 'start'を使用して、プログラミングのタイプとそのアプローチを表示できます。メソッド「start」のシグニチャをよく見ると、class_prgm型のインポートパラメータを受け取っていることがわかります。ただし、Start-Of-Selectionイベントでは、このメソッドは実行時にclass_procedural型とclass_OO型のオブジェクトで呼び出されています。

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.

上記のコードは次の出力を生成します-

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

ABAPランタイム環境は、インポートパラメータclass1_prgmの割当中に暗黙的なナローイングキャストを実行します。この機能は、「start」メソッドを一般的に実装するのに役立ちます。オブジェクト参照変数に関連付けられた動的タイプ情報により、ABAPランタイム環境は、オブジェクト参照変数が指すオブジェクトで定義された実装にメソッド呼び出しを動的にバインドすることができます。たとえば、「class_type_approach」クラスのメソッド「start」のインポートパラメータ「class1_prgm」は、それ自体ではインスタンス化できない抽象型を参照しています。

class_proceduralやclass_OOなどの具象サブクラス実装でメソッドが呼び出されると、class1_prgm参照パラメーターの動的型がこれらの具象型の1つにバインドされます。したがって、メソッド 'prgm_type'および 'approach1'の呼び出しは、クラス 'class_prgm'で提供される未定義の抽象実装ではなく、class_proceduralまたはclass_OOサブクラスで提供される実装を参照します。