构造器与方法调用 (★★★)
#abap-objects #oo-basics #constructor #method-call
概览表
| 项目 |
关键点 |
| 实例构造器 |
METHODS: constructor, 创建对象时自动调用 |
| 静态构造器 |
CLASS-METHODS: class_constructor, 类首次使用时自动调用 |
| 方法调用 |
显式/简写/函数式三种语法 |
| ME |
方法内的自引用 |
构造器 (Constructor)
实例构造器
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. METHODS: constructor IMPORTING !iv_make TYPE string !iv_model TYPE string. ENDCLASS.
CLASS lcl_vehicle IMPLEMENTATION. METHOD constructor. make = iv_make. model = iv_model. ENDMETHOD. ENDCLASS.
|
调用方式:
1 2 3 4
| CREATE OBJECT vehicle EXPORTING iv_make = 'BMW' iv_model = 'X5'.
|
关键规则:
- 每个类最多一个实例构造器
- 构造器不能重定义(REDEFINITION)
- 构造器只能定义在 PUBLIC SECTION(一般情况下)
- 实例化对象时自动调用
静态构造器
1 2 3 4
| CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. CLASS-METHODS: class_constructor. ENDCLASS.
|
关键规则:
- 无参数,不能有 IMPORTING/EXPORTING
- 类首次被使用时自动调用(CREATE OBJECT 或访问静态组件)
- 只执行一次
- 不能显式调用
静态构造器在类首次被访问时自动触发。应避免在静态构造器中访问其他类的静态属性,因为可能导致不可预期的初始化顺序。
方法调用语法
三种调用方式
| 方式 |
语法 |
适用场景 |
| 显式调用 |
CALL METHOD ref->meth EXPORTING ... |
兼容旧代码 |
| 简写调用 |
ref->meth( iv_param = value ). |
推荐方式 |
| 函数式调用 |
DATA(result) = ref->meth( ). |
有RETURNING参数的方法 |
参数传递简写
1 2 3 4 5 6 7 8 9 10 11 12 13
| " 无参数 ref->meth( ).
" 一个IMPORTING参数 ref->meth( value ). " 位置参数 ref->meth( iv_param = value ). " 命名参数
" 多个IMPORTING参数 ref->meth( EXPORTING iv_a = a iv_b = b ). ref->meth( iv_a = a iv_b = b ). " 简写可省略EXPORTING
" 接收RETURNING值 DATA(count) = ref->get_count( ).
|
函数式方法 (Functional Method)
有 RETURNING 参数的方法可以像函数一样使用:
1 2 3 4 5 6 7
| " 直接在表达式中使用 IF ref->is_valid( ) = abap_true. WRITE: / ref->get_name( ). ENDIF.
" 链式调用(7.0 EhP2+) ref->get_vehicle( )->get_motor( )->get_power( ).
|
自引用 ME
1 2 3 4
| METHOD some_method. me->attribute = value. " 明确指向自身属性 CALL METHOD me->method. " 调用自身方法 ENDMETHOD.
|
ME 是预定义的引用变量
- 在每个实例方法中自动可用
- 指向当前对象实例本身
- 常用于区分参数名和属性名同名的情况
私有方法与公有方法的协作
1 2 3 4 5 6 7 8 9 10 11
| 外部调用者 │ ↓ ┌──────────────────┐ │ 公有方法 │ ← 外部接口 │ (入口点) │ │ │ │ │ ↓ │ │ 私有方法 │ ← 内部实现细节 │ (辅助逻辑) │ └──────────────────┘
|
私有方法将复杂的实现细节隐藏在公有方法背后,实现真正的封装。
考试/测试模式
| 场景/关键词 |
答案 |
| “构造器能重定义吗” |
不能 |
| “静态构造器参数” |
不能有任何参数 |
| “静态构造器何时调用” |
类首次被使用时,自动调用一次 |
| “ME的用途” |
区分同名参数和属性,明确自引用 |
| “函数式方法” |
有 RETURNING 参数的方法 |
| “链式调用” |
7.0 EhP2+ 支持 ref->meth( )->meth2( ) |