继承基础
继承基础 (★★★)
#abap-objects #inheritance #redefinition
概览表
| 项目 | 关键点 |
|---|---|
| 继承关系 | INHERITING FROM 定义子类 |
| 方法重定义 | REDEFINITION 改变继承方法的实现(不改签名) |
| PROTECTED | 受保护组件对子类可见 |
| 构造器规则 | 不被继承,子类必须调用 super->constructor( ) |
泛化/特化关系 (Generalization/Specialization)
继承实现的是 “is-a” 关系:
1 | "一辆卡车是一种交通工具" |
继承的优势
- 共同组件只在父类中定义一次
- 修改父类自动影响所有子类
- 更好的软件结构
⚠️继承的风险
不能在子类中移除父类的任何组件,只能添加或修改。修改父类语义会影响所有子类,需要非常谨慎。
继承语法
1 | CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle. |
关键规则:
- ABAP Objects 不支持多重继承(只能有一个直接父类)
- 但可以通过接口模拟多重继承
- 继承是单向关系:子类知道父类,父类不知道子类
方法重定义 (Redefinition)
1 | CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle. |
重定义规则:
| 规则 | 说明 |
|---|---|
| 不能改变签名 | 方法参数和异常不能修改 |
| 可见性不变 | 父类中的可见性分区必须保持 |
| 不能重定义私有方法 | PRIVATE SECTION 中的方法不可重定义 |
使用 super-> |
在子类实现中调用父类的原始方法 |
📌重定义(Redefinition) ≠ 重载(Overloading)
- ABAP Objects 不支持重载(同名方法多个不同签名)
- 变通方案:一个方法名使用可选参数的不同组合
构造器在继承中的规则
1 | " 子类定义了自己的构造器 |
构造器规则总结
| 情况 | 行为 |
|---|---|
| 子类没有定义构造器 | 使用父类的构造器 |
| 子类定义了构造器 | 必须调用 super->constructor( ) |
| 静态构造器 | 自动调用父类的静态构造器(无需手动调用) |
PROTECTED SECTION
继承引入了新的可见性级别:
| 可见性 | 类内部 | 子类 | 外部 |
|---|---|---|---|
| PUBLIC | ✓ | ✓ | ✓ |
| PROTECTED | ✓ | ✓ | ✗ |
| PRIVATE | ✓ | ✗ | ✗ |
⚠️声明顺序必须严格
PUBLIC SECTION → PROTECTED SECTION → PRIVATE SECTION考试/测试模式
| 场景/关键词 | 答案 |
|---|---|
| “ABAP支持多重继承吗” | 不支持,但可通过接口模拟 |
| “重定义能改变签名吗” | 不能 |
| “子类构造器必须做什么” | 调用 super->constructor( ) |
| “PROTECTED可见范围” | 类自身 + 所有子类 |
| “能重定义私有方法吗” | 不能 |
| “重载 vs 重定义” | ABAP不支持重载;重定义只改实现不改签名 |