抽象类与最终类

抽象类与最终类 (★★★)

#abap-objects #abstract-class #final-class

概览表

项目 关键点
抽象类 不能实例化,作为父类使用
抽象方法 只有声明没有实现,子类必须实现
最终类 不能被继承
最终方法 不能被重定义

抽象类 (Abstract Class)

1
2
3
4
5
6
CLASS lcl_vehicle DEFINITION ABSTRACT.
PUBLIC SECTION.
METHODS: display ABSTRACT.
" 可以有普通方法
METHODS: get_speed RETURNING VALUE(rv_speed) TYPE i.
ENDCLASS.

特性

规则 说明
不能实例化 CREATE OBJECT 会报错
可以有抽象方法 只有声明,没有实现
可以有普通方法 包含完整实现
子类必须实现抽象方法 除非子类也是抽象类
静态方法不能是抽象的 因为静态方法不能被重定义

使用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
LCL_VEHICLE (抽象类)
│ display( ) → 抽象方法
│ get_speed( ) → 有实现

├── LCL_CAR
│ display( ) → 必须实现

└── LCL_TRUCK
display( ) → 必须实现

" 不能: CREATE OBJECT lo_vehicle TYPE lcl_vehicle. ← 错误!
" 可以: CREATE OBJECT lo_car TYPE lcl_car. ← 正确
" 可以: DATA: lo_v TYPE REF TO lcl_vehicle = lo_car. ← up-cast
💡抽象类引用可以用于多态
虽然不能创建抽象类的实例,但可以使用抽象类的引用通过 up-cast 指向子类实例,实现多态调用。

抽象方法 (Abstract Method)

1
2
METHODS: calculate_price ABSTRACT
RETURNING VALUE(rv_price) TYPE decfloat16.
  • 只有声明,没有实现
  • 子类必须实现(除非子类也是抽象类)
  • 不能在 PRIVATE SECTION 中声明

最终类 (Final Class)

1
2
3
4
5
6
CLASS lcl_math_utils DEFINITION FINAL.
PUBLIC SECTION.
CLASS-METHODS: calculate
IMPORTING !iv_value TYPE i
RETURNING VALUE(rv_result) TYPE i.
ENDCLASS.

特性

规则 说明
不能被继承 没有子类
所有方法隐式为最终 不能重定义不存在的继承
可以正常实例化 和普通类一样

同时抽象和最终

  • 理论上可以但只应包含静态组件
  • 没有实际继承价值

最终方法 (Final Method)

1
2
3
4
5
CLASS lcl_vehicle DEFINITION.
PUBLIC SECTION.
METHODS: get_speed FINAL " 不能在子类中重定义
RETURNING VALUE(rv_speed) TYPE i.
ENDCLASS.
  • 该方法不能在任何子类中被重定义
  • 但子类仍然继承该方法(只是不能改)

抽象 vs 最终 对比

特性 抽象 (ABSTRACT) 最终 (FINAL)
类级别 不能实例化 不能被继承
方法级别 子类必须实现 子类不能重定义
用途 定义框架/骨架 防止修改/扩展
实例化
被继承

考试/测试模式

场景/关键词 答案
“抽象类能实例化吗” 不能
“抽象方法有实现吗” 没有,子类必须实现
“最终类能被继承吗” 不能
“静态方法能是抽象的吗” 不能
“抽象类引用能做什么” 可以用于多态(up-cast到子类实例)