继承基础

继承基础 (★★★)

#abap-objects #inheritance #redefinition

概览表

项目 关键点
继承关系 INHERITING FROM 定义子类
方法重定义 REDEFINITION 改变继承方法的实现(不改签名)
PROTECTED 受保护组件对子类可见
构造器规则 不被继承,子类必须调用 super->constructor( )

泛化/特化关系 (Generalization/Specialization)

继承实现的是 “is-a” 关系:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
"一辆卡车是一种交通工具"

LCL_VEHICLE (父类/超类)
├── make, model, speed (共同属性)
├── set_type( ) (共同方法)
├── display( )

├── LCL_CAR (子类)
│ └── num_seats (特有属性)

├── LCL_TRUCK (子类)
│ └── cargo (特有属性)

└── LCL_BUS (子类)
└── line_name (特有属性)

继承的优势

  • 共同组件只在父类中定义一次
  • 修改父类自动影响所有子类
  • 更好的软件结构
⚠️继承的风险
不能在子类中移除父类的任何组件,只能添加或修改。修改父类语义会影响所有子类,需要非常谨慎。

继承语法

1
2
3
4
5
6
CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle.
PUBLIC SECTION.
METHODS: get_cargo RETURNING VALUE(rv_cargo) TYPE i.
PRIVATE SECTION.
DATA: mv_cargo TYPE i.
ENDCLASS.

关键规则:

  • ABAP Objects 不支持多重继承(只能有一个直接父类)
  • 但可以通过接口模拟多重继承
  • 继承是单向关系:子类知道父类,父类不知道子类

方法重定义 (Redefinition)

1
2
3
4
5
6
7
8
9
10
11
12
13
CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle.
PUBLIC SECTION.
METHODS: display REDEFINITION. " 重定义
ENDCLASS.

CLASS lcl_car IMPLEMENTATION.
METHOD display.
" 调用父类的实现
super->display( ).
" 添加子类特有的输出
WRITE: / 'Seats:', me->mv_num_seats.
ENDMETHOD.
ENDCLASS.

重定义规则:

规则 说明
不能改变签名 方法参数和异常不能修改
可见性不变 父类中的可见性分区必须保持
不能重定义私有方法 PRIVATE SECTION 中的方法不可重定义
使用 super-> 在子类实现中调用父类的原始方法
📌重定义(Redefinition) ≠ 重载(Overloading)
  • ABAP Objects 不支持重载(同名方法多个不同签名)
  • 变通方案:一个方法名使用可选参数的不同组合

构造器在继承中的规则

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
" 子类定义了自己的构造器
CLASS lcl_truck DEFINITION INHERITING FROM lcl_vehicle.
PUBLIC SECTION.
METHODS: constructor
IMPORTING
!iv_make TYPE string
!iv_model TYPE string
!iv_cargo TYPE i.
ENDCLASS.

CLASS lcl_truck IMPLEMENTATION.
METHOD constructor.
" 必须先调用父类构造器
super->constructor( iv_make = iv_make iv_model = iv_model ).
mv_cargo = iv_cargo.
ENDMETHOD.
ENDCLASS.

构造器规则总结

情况 行为
子类没有定义构造器 使用父类的构造器
子类定义了构造器 必须调用 super->constructor( )
静态构造器 自动调用父类的静态构造器(无需手动调用)

PROTECTED SECTION

继承引入了新的可见性级别:

可见性 类内部 子类 外部
PUBLIC
PROTECTED
PRIVATE
⚠️声明顺序必须严格
PUBLIC SECTIONPROTECTED SECTIONPRIVATE SECTION

考试/测试模式

场景/关键词 答案
“ABAP支持多重继承吗” 不支持,但可通过接口模拟
“重定义能改变签名吗” 不能
“子类构造器必须做什么” 调用 super->constructor( )
“PROTECTED可见范围” 类自身 + 所有子类
“能重定义私有方法吗” 不能
“重载 vs 重定义” ABAP不支持重载;重定义只改实现不改签名