继承的本质是代码重用
子类继承父类所有 Public 和 Protected 的属性和方法
语法格式
CLASS <subclass> DEFINITION INHERITING FROM <superclass>.
<subclass>:子类
<superclass>:父类
例1
创建一个父类 lcl_vehicle
lcl_vehicle 父类实现了 show_speed 和 accelerate 两个方法
接下来创建 lcl_car 子类继承 lcl_vehicle 父类
INHERITING FROM关键字表示该类从lcl_vehicle类继承
此时lcl_car类并没有IMPLEMENTATION部分,但因为它继承自lcl_vehicle,所以是完成的,可以基于它创建对象
输出结果:
接下来改写show_speed方法
在子类lcl_car的 DEFINITION 区域,在子类新建show_speed方法并在其后面附加 REDEFINITION关键字
使用了 REDEFINITION 修饰的方法必须在 IMPLEMENTATION 区域实现
该show_speed方法不会自动调用父类方法的任何代码,如果需要调用父类的方法代码,用 super 关键字进行调用,super 代表父类
对于 REDEFINITION 重新定义过的方法,当然不能满足于 仅仅使用 super 调用父类方法,这样子类的方法功能与父类完全相同
在子类的方法中,可以编写子类专属的方法实现,比如在 show_speed 方法中用不同于父类的方法显示 car 的速度
因为这里要用到 speed 属性,这个属性是 lcl_vehicle 类的 private 属性,子类 lcl_car 不能访问,将 lcl_vehicle 的 speed 属性改为 protected 才能进行访问
完整代码如下所示
REPORT z437_test_2025.
* 父类
CLASS lcl_vehicle DEFINITION.
PUBLIC SECTION.
METHODS: show_speed,
accelerate IMPORTING delta TYPE i.
PROTECTED SECTION.
DATA: speed TYPE i.
ENDCLASS.
CLASS lcl_vehicle IMPLEMENTATION.
METHOD show_speed.
WRITE: / me->speed.
ENDMETHOD.
METHOD accelerate.
me->speed = me->speed + delta.
ENDMETHOD.
ENDCLASS.
* 子类
CLASS lcl_car DEFINITION INHERITING FROM lcl_vehicle.
PUBLIC SECTION.
METHODS: show_speed REDEFINITION. " 重写父类方法
ENDCLASS.
CLASS lcl_car IMPLEMENTATION.
METHOD show_speed.
WRITE: / 'Car current speed is:', me->speed.
ENDMETHOD.
ENDCLASS.
START-OF-SELECTION.
" 定义变量
DATA: v1 TYPE REF TO lcl_car.
" 创建实例
CREATE OBJECT v1.
v1->accelerate( 80 ).
v1->show_speed( ).
输出结果: