构造器与方法调用

构造器与方法调用 (★★★)

#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( )