类、属性与方法

类、属性与方法 (★★★)

#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 限制
  • 在类的 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 参数
  • RETURNING 参数只能有一个
  • 使用 VALUE() 传递(值传递)
  • RETURNING 参数的方法称为函数式方法(Functional Method)
  • 不能同时有 EXPORTING/CHANGINGRETURNING

实例方法 vs 静态方法

类型 语法 可访问
实例方法 METHODS: meth. 实例属性 + 静态属性
静态方法 CLASS-METHODS: meth. 静态属性

考试/测试模式

场景/关键词 答案
“READ-ONLY限制” 只能在 PUBLIC SECTION 中使用
“LIKE在类中的使用” 仅限本地数据对象和SY字段
“CLASS嵌套” 不允许,但可以定义局部辅助类
“RETURNING参数限制” 只能有一个,使用值传递,不能与EXPORTING/CHANGING共存
“静态方法能访问什么” 只能访问静态属性,不能访问实例属性