ABAP 类接口

ABAP 类接口

📖 简介

接口(Interface)在ABAP中类似于类,充当对象的数据类型。接口的组件与类的组件相同,但接口的定义不需要可见性部分。

🔄 接口的核心概念

  • 数据类型:接口作为对象的数据类型
  • 契约定义:定义类必须实现的方法
  • 多态基础:与继承一起实现多态性
  • 松耦合:降低类之间的耦合度

💡 关键区别 - 与类的声明不同,接口的声明不包括可见性部分。这是因为在接口声明中定义的组件总是集成在类的public visibility部分。

🏗️ 接口语法

基本格式

1
2
3
4
5
6
INTERFACE <intf_name>.
DATA.....
CLASS-DATA.....
METHODS.....
CLASS-METHODS.....
ENDINTERFACE.

在此语法中:

  • <intf_name> 表示接口的名称
  • DATACLASS-DATA 分别用于定义接口的实例和静态属性
  • METHODSCLASS-METHODS 分别用于定义接口的实例和静态方法

📊 接口组件类型

组件类型 关键字 描述
实例数据 DATA 接口实例的数据属性
静态数据 CLASS-DATA 接口类的静态属性
实例方法 METHODS 接口实例的方法
静态方法 CLASS-METHODS 接口类的静态方法

🔗 接口实现

在类中使用接口

1
INTERFACE <intf_name>.

注意:此语法必须在类的public部分中使用。

实现接口方法

1
2
3
METHOD <intf_name~method_m>.
<statements>.
ENDMETHOD.

在此语法中:

  • <intf_name~method_m> 表示 <intf_name> 接口的方法的完全声明的名称

🚨 重要特性

接口的所有方法都是抽象的

  • 它们是完全声明的,包括它们的参数接口
  • 但是没有在接口中实现
  • 所有想要使用接口的类都必须实现接口的所有方法
  • 否则,该类将成为抽象类

📝 接口示例

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
REPORT zinterface1.

INTERFACE my_interface1.
METHODS msg.
ENDINTERFACE.

CLASS num_counter DEFINITION.
PUBLIC SECTION.
INTERFACES my_interface1.
METHODS add_number.
PRIVATE SECTION.
DATA num TYPE i.
ENDCLASS.

CLASS num_counter IMPLEMENTATION.
METHOD my_interface1~msg.
WRITE: / 'The number is', num.
ENDMETHOD.
METHOD add_number.
ADD 7 TO num.
ENDMETHOD.
ENDCLASS.

CLASS drive1 DEFINITION.
PUBLIC SECTION.
INTERFACES my_interface1.
METHODS speed1.
PRIVATE SECTION.
DATA wheel1 TYPE i.
ENDCLASS.

CLASS drive1 IMPLEMENTATION.
METHOD my_interface1~msg.
WRITE: / 'Total number of wheels is', wheel1.
ENDMETHOD.
METHOD speed1.
ADD 4 TO wheel1.
ENDMETHOD.
ENDCLASS.

START-OF-SELECTION.
DATA object1 TYPE REF TO num_counter.
CREATE OBJECT object1.
CALL METHOD object1->add_number.
CALL METHOD object1->my_interface1~msg.

DATA object2 TYPE REF TO drive1.
CREATE OBJECT object2.
CALL METHOD object2->speed1.
CALL METHOD object2->my_interface1~msg.

📝 输出结果

1
2
The number is 7
Total number of wheels is 4

🔍 代码解析



graph TB
    A[接口 my_interface1] -->|实现| B[num_counter]
    A -->|实现| C[drive1]
    B --> D[add_number方法]
    B --> E[msg实现]
    C --> F[speed1方法]
    C --> G[msg实现]

在上面的示例中:

  • my_interface1 是包含 msg 方法的接口
  • 定义了两个类:num_counterdrive1
  • 这两个类都实现了 msg 方法,但实现内容不同
  • 每个类还有自己的特定方法:add_numberspeed1

💡 注意 - add_numberspeed1 方法特定于各个类,而 msg 方法通过接口统一调用,但根据类不同有不同实现。

💡 接口的优势

📈 1. 实现多态性

当两个类似的类具有相同名称的方法但功能彼此不同时,使用接口。接口以及继承特性为多态性提供了基础。这是因为接口中定义的方法在不同类中的行为可能不同。

🔧 2. 降低耦合度



graph LR
    A[调用方] --> B[接口]
    B --> C[实现类1]
    B --> D[实现类2]
    B --> E[实现类3]

调用方只需要知道接口,而不需要知道具体的实现类。

🛡️ 3. 标准化契约

接口定义了统一的契约,确保所有实现类都遵循相同的规范。

🎯 使用场景

1. 策略模式实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
INTERFACE strategy.
METHODS: execute IMPORTING data TYPE any.
ENDINTERFACE.

class_algo_a DEFINITION.
PUBLIC SECTION.
INTERFACES strategy.
PRIVATE SECTION.
METHODS: algo_a_specific IMPORTING data TYPE any.
ENDCLASS.

class_algo_b DEFINITION.
PUBLIC SECTION.
INTERFACES strategy.
PRIVATE SECTION.
METHODS: algo_b_specific IMPORTING data TYPE any.
ENDCLASS.

2. 工厂模式支持

1
2
3
4
5
6
7
8
9
10
INTERFACE factory.
CLASS-METHODS: create_object RETURNING VALUE(obj) TYPE ref to any.
ENDINTERFACE.

class_product_factory DEFINITION.
PUBLIC SECTION.
INTERFACES factory.
PRIVATE SECTION.
METHODS: create_product RETURNING VALUE(obj) TYPE ref to any.
ENDCLASS.

3. 事件处理

1
2
3
4
5
6
7
8
9
10
11
12
INTERFACE event_handler.
METHODS: handle_event IMPORTING event_type TYPE string
data TYPE any.
ENDINTERFACE.

class_ui_controller DEFINITION.
PUBLIC SECTION.
INTERFACES event_handler.
PRIVATE SECTION.
METHODS: process_event IMPORTING event_type TYPE string
data TYPE any.
ENDCLASS.

📋 接口设计原则

最佳实践

  1. 单一职责原则

    • 每个接口应该只定义一个相关的功能集
    • 避免接口过于庞大
  2. 接口隔离原则

    • 客户端不应该依赖它不需要的接口
    • 将大接口拆分为多个小接口
  3. 开闭原则

    • 对扩展开放
    • 对修改封闭

📊 接口设计检查清单

设计原则 实践方式
职责单一 每个接口专注于特定功能领域
保持简洁 避免接口过于庞大复杂
命名清晰 使用有意义的名称描述接口目的
版本管理 当需要修改接口时考虑向后兼容性

🔧 高级特性

1. 接口继承

1
2
3
4
5
6
7
INTERFACE parent_interface.
METHODS: parent_method.
ENDINTERFACE.

INTERFACE child_interface INHERITING FROM parent_interface.
METHODS: child_method.
ENDINTERFACE.

2. 接口常量

1
2
3
4
INTERFACE constants_interface.
CONSTANTS: max_items TYPE i VALUE 100,
min_items TYPE i VALUE 0.
ENDINTERFACE.

3. 接口异常

1
2
3
4
5
6
INTERFACE exception_interface.
METHODS: method_name
IMPORTING param TYPE any
EXCEPTIONS: error1,
error2.
ENDINTERFACE.