SAP ABAP 多态
术语多态性字面上的意思是 "多种形式"。从面向对象的角度来看,多态性与继承相结合,使继承树中的各种类型可以互换使用。也就是说,当存在类的层次结构并且它们通过继承相关联时,就会发生多态性。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
引用参数的动态类型都绑定到这些具体类型之一。因此,对方法 prgm_type
和 approach1
的调用是指 class_procedural
或 class_OO
子类中提供的实现,而不是类 class_prgm
中提供的未定义的抽象实现。