SAP ABAP 多态性
术语多态性字面意思是“多种形式”。从面向对象的角度来看,多态性与继承一起工作,使得继承树中的各种类型可以互换使用。也就是说,当存在类的层次结构并且它们通过继承相关时,发生多态性。 ABAP多态意味着对方法的调用将导致根据调用方法的对象的类型执行不同的方法。
以下程序包含一个抽象类'class_prgm',2个子类(class_procedural和class_OO)和一个测试驱动程序类'class_type_approach'。在这个实现中,类方法“开始”允许我们显示编程的类型及其方法。如果仔细观察方法“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的分配期间执行隐式精简转换。此功能有助于“启动”方法的一般实现。与对象引用变量相关联的动态类型信息允许ABAP运行时环境动态地将方法调用与由对象引用变量指向的对象中定义的实现绑定。例如,'class_type_approach'类中的'start'方法的导入参数'class1_prgm'指的是一个永远不能被实例化的抽象类型。
每当使用具体子类实现(如class_procedural或class_OO)调用该方法时,class1_prgm引用参数的动态类型将绑定到这些具体类型之一。因此,对方法'prgm_type'和'approach1'的调用是指class_procedural或class_OO子类中提供的实现,而不是类'class_prgm'中提供的未定义的抽象实现。