ABAP 多态性
📖 简介
多态性(Polymorphism)字面意思是”多种形式”。从面向对象的角度来看,多态性与继承一起工作,使得继承树中的各种类型可以互换使用。也就是说,当存在类的层次结构并且它们通过继承相关时,发生多态性。
ABAP多态意味着对方法的调用将导致根据调用方法的对象的类型执行不同的方法。
🔄 多态性原理
多态性的核心概念:
- 继承关系:类之间通过继承形成层次结构
- 方法重写:子类可以重写父类的抽象方法
- 动态绑定:运行时根据对象的实际类型绑定相应的方法实现
- 类型转换:支持隐式类型转换,使代码更加灵活
🔗 关键特性
graph LR
A[抽象基类] --> B[子类1]
A --> C[子类2]
B --> D[方法重写]
C --> D
D --> E[动态方法调用]
💡 实现原理
当方法被调用时,ABAP运行时环境执行以下步骤:
- 参数传递:检查方法签名和参数类型
- 隐式类型转换:将子类对象隐式转换为父类引用
- 动态绑定:根据对象的实际类型绑定相应的方法实现
- 方法执行:执行对应类型的特定实现
注意 - ABAP运行时环境在导入参数分配期间执行隐式精简转换。此功能有助于方法的通用实现。与对象引用变量相关联的动态类型信息允许ABAP运行时环境动态地将方法调用与由对象引用变量指向的对象中定义的实现绑定。
📝 示例程序
以下程序包含一个抽象类 class_prgm,2个子类(class_procedural 和 class_OO)和一个测试驱动程序类 class_type_approach。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| 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.
|
📊 输出结果
1 2
| Procedural programming follows top-down approach Object oriented programming follows bottom-up approach
|
🎯 代码解析
类结构分析
| 类名 |
类型 |
作用 |
class_prgm |
抽象基类 |
定义抽象方法 |
class_procedural |
具体子类 |
实现过程化编程 |
class_oo |
具体子类 |
实现面向对象编程 |
class_type_approach |
驱动类 |
测试多态性 |
关键代码说明
1 2 3 4
| CLASS class_type_approach DEFINITION. PUBLIC SECTION. CLASS-METHODS: start IMPORTING class1_prgm TYPE REF TO class_prgm. ENDCLASS.
|
start 方法接收一个 class_prgm 类型的参数
- 虽然声明为抽象类型,但在运行时接收具体子类对象
- 调用方法时会根据实际对象类型执行相应实现
1 2 3 4 5 6 7 8
| 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. CALL METHOD class_type_approach=>start EXPORTING class1_prgm = class_2.
|
- 创建两个不同类型的对象
- 使用相同的方法调用,但根据对象类型产生不同输出
- 展示了多态性的本质:同一接口,不同实现
🚀 应用场景
1. 框架开发
2. 设计模式实现
- 策略模式:不同的算法实现
- 工厂模式:创建不同类型对象
- 观察者模式:不同的事件处理
3. 业务逻辑扩展