类、属性与方法 (★★★) #abap-objects #oo-basics #class-definition #visibility
概览表
项目
关键点
类定义
CLASS ... DEFINITION + CLASS ... IMPLEMENTATION
属性
DATA(实例), CLASS-DATA(静态), CONSTANTS, TYPES
方法
METHODS(实例), CLASS-METHODS(静态)
可见性
PUBLIC / PROTECTED / PRIVATE
类定义结构 1 2 3 4 5 6 7 8 9 10 11 12 CLASS lcl_vehicle DEFINITION. PUBLIC SECTION. " 公有组件声明 PROTECTED SECTION. " 受保护组件声明 PRIVATE SECTION. " 私有组件声明 ENDCLASS. CLASS lcl_vehicle IMPLEMENTATION. " 方法实现 ENDCLASS.
CLASS 语句不能嵌套 (不能在类中定义类)
但可以为全局类定义局部辅助类
可见性部分必须按 PUBLIC → PROTECTED → PRIVATE 顺序声明
属性类型对比
语法
类型
作用域
说明
DATA: attr TYPE type.
实例属性
每对象独立
每个对象有自己的一份
CLASS-DATA: attr TYPE type.
静态属性
全类共享
所有对象共用一份
CONSTANTS: c TYPE type VALUE v.
常量
不可变
声明时必须赋值
TYPES: t TYPE ...
局部类型
类内使用
与类相关的自定义类型
在类的 DATA 语句中,只能使用 TYPE 引用数据类型
LIKE 仅允许用于本地数据对象 或 SY字段 (如 SY-DATE, SY-UNAME)
READ-ONLY 属性 1 2 PUBLIC SECTION. DATA: make TYPE string READ-ONLY.
外部可以读取 但不能修改
只有类内部的方法 可以修改
只能在 PUBLIC SECTION 中使用
可见性 (Visibility) 1 2 3 4 5 6 7 8 9 10 ┌─────────────────────────────────┐ │ PUBLIC SECTION (+) │ ← 外部可直接访问 │ 公有属性、方法、常量、类型 │ ├─────────────────────────────────┤ │ PROTECTED SECTION (#) │ ← 仅子类和自身可访问 │ 受保护属性、方法 │ ├─────────────────────────────────┤ │ PRIVATE SECTION (-) │ ← 仅自身可访问 │ 私有属性、方法 │ └─────────────────────────────────┘
封装 (Encapsulation) 的核心原则
将属性设为私有 (PRIVATE)
通过公有方法 (PUBLIC METHODS) 提供受控访问
方法签名明确约束了参数的传递规则
外部用户不需要了解内部实现
严格来说公有属性违背OO原则。但在ABAP中:
内表操作(READ TABLE, WHERE 子句)不能使用函数式方法
这种特殊情况下可以使用公有只读属性 (READ-ONLY)
方法定义 方法签名 1 2 3 4 5 6 7 8 9 10 11 12 METHODS: set_type IMPORTING !iv_make TYPE string !iv_model TYPE string EXPORTING !ev_result TYPE boolean CHANGING !cv_data TYPE any RETURNING VALUE(rv_count) TYPE i EXCEPTIONS error = 1.
参数类型
方向
说明
IMPORTING
调用者→方法
输入参数
EXPORTING
方法→调用者
输出参数
CHANGING
双向
输入输出参数
RETURNING
方法→调用者
函数式返回值(只能有一个)
RETURNING 参数只能有一个
使用 VALUE() 传递(值传递)
有 RETURNING 参数的方法称为函数式方法 (Functional Method)
不能同时有 EXPORTING/CHANGING 和 RETURNING
实例方法 vs 静态方法
类型
语法
可访问
实例方法
METHODS: meth.
实例属性 + 静态属性
静态方法
CLASS-METHODS: meth.
仅 静态属性
考试/测试模式
场景/关键词
答案
“READ-ONLY限制”
只能在 PUBLIC SECTION 中使用
“LIKE在类中的使用”
仅限本地数据对象和SY字段
“CLASS嵌套”
不允许,但可以定义局部辅助类
“RETURNING参数限制”
只能有一个,使用值传递,不能与EXPORTING/CHANGING共存
“静态方法能访问什么”
只能访问静态属性,不能访问实例属性