全局类与方法 (★★★★)
#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.
|
一个方法可以使用传统异常或基于类的异常 — 不能在同一方法中同时使用两者。
创建全局类
- 在包上点击上下文菜单 → 创建 → 类库 → 类
- 输入名称、描述、属性
- 保存 → 分配到包和传输请求
- 在方法标签页创建方法
- 定义参数和异常
- 实现源代码(方法 → 源代码按钮)
构造函数
- 特殊方法 CONSTRUCTOR,在 CREATE OBJECT 后自动调用
- 用于初始化实例属性
- 输入参数在 CREATE OBJECT 时提供
考试/测试模式
| 场景/关键词 |
答案 |
| “静态组件选择符?” |
=> (双箭头) |
| “实例组件选择符?” |
-> (单箭头) |
| “创建实例?” |
CREATE OBJECT ref_var. |
| “方法可以混合异常类型吗?” |
不可以 — 传统或基于类的二选一 |
| “函数组可以有多个实例吗?” |
不可以 — 每个上下文仅一个 |
| “类可以有多个实例吗?” |
可以 — 按需创建任意数量 |
相关笔记