全局类与方法 (★★★★)

全局类与方法 (★★★★)

#abap #abap-modularization

概览表

概念 要点
包含属性和方法的蓝图
对象/实例 类的具体实现
静态组件 每个程序上下文一个(无需实例化)
实例组件 每个对象一个(需要 CREATE OBJECT)

类与函数组的比较

方面 函数组 全局类
多实例 否(每个上下文一个) (多个对象)
封装性 全局数据隐藏 公有 + 私有组件
方法/函数 函数模块 方法
全局数据 在函数模块间共享 属性(实例或静态)

静态与实例组件

1
2
3
4
5
6
7
8
9
静态组件
├── 每个程序上下文存在一个
├── 无需实例化即可调用
└── 语法:class_name=>component (静态选择符 =>)

实例组件
├── 每个对象一个(不同的值)
├── 需要先执行 CREATE OBJECT
└── 语法:ref_var->component (实例选择符 ->)

调用方法

静态方法调用

1
2
3
4
CALL METHOD cl_bc400_compute=>get_power
EXPORTING iv_base = pa_int1
iv_power = pa_int2
IMPORTING ev_result = gv_result.

实例方法调用

1
2
3
4
DATA go_ref TYPE REF TO cl_class.
CREATE OBJECT go_ref.
CALL METHOD go_ref->method_name
EXPORTING iv_param = lv_val.
💡方法调用生成
使用拖放Pattern → ABAP Objects Pattern → Call Method 来生成方法调用,避免错误。

方法的异常处理

传统异常 (sy-subrc)

1
2
3
4
5
CALL METHOD cl_class=>method
EXCEPTIONS error1 = 1 error2 = 2.
CASE sy-subrc.
WHEN 0. " 成功
ENDCASE.

基于类的异常 (TRY/CATCH)

1
2
3
4
5
6
7
TRY.
CALL METHOD cl_class=>method
EXPORTING iv_param = lv_val
IMPORTING ev_result = lv_result.
CATCH cx_exception_class.
" 处理错误
ENDTRY.
📌异常概念不能混合
一个方法可以使用传统异常基于类的异常 — 不能在同一方法中同时使用两者。

创建全局类

  1. 在包上点击上下文菜单 → 创建 → 类库 → 类
  2. 输入名称、描述、属性
  3. 保存 → 分配到包和传输请求
  4. 在方法标签页创建方法
  5. 定义参数和异常
  6. 实现源代码(方法 → 源代码按钮)

构造函数

  • 特殊方法 CONSTRUCTOR,在 CREATE OBJECT 后自动调用
  • 用于初始化实例属性
  • 输入参数在 CREATE OBJECT 时提供

考试/测试模式

场景/关键词 答案
“静态组件选择符?” => (双箭头)
“实例组件选择符?” -> (单箭头)
“创建实例?” CREATE OBJECT ref_var.
“方法可以混合异常类型吗?” 不可以 — 传统或基于类的二选一
“函数组可以有多个实例吗?” 不可以 — 每个上下文仅一个
“类可以有多个实例吗?” 可以 — 按需创建任意数量

相关笔记