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 DefinitionInheriting 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 DefinitionInheriting 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_prgmType 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⇒startExportingclass1_prgm = class_1.New-Line.CALL Method class_type_approach⇒startExportingclass1_prgm = class_2.
结果如下:
Procedural programming follows top-down approachObject 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 中提供的未定义的抽象实现。