面向对象编程模型

面向对象编程模型 (★★★)

#abap-objects #oo-basics

概览表

项目 关键点
过程式模型 数据与函数分离,全局变量可被任意访问
函数组 封装数据与服务,但只能有一个实例
OO模型 封装 + 多实例化 + 继承 + 多态

过程式编程模型

数据和函数通常分开存储:

  • 全局变量存储数据
  • 子程序(Subroutines) 存储函数
  • 每个子程序都可以访问任何变量 → 无法保证一致的数据访问

典型过程式ABAP程序结构:

1
2
3
4
5
类型定义 + 数据声明          (数据)
├── Modularization Units (函数)
│ ├── Subroutines (FORM)
│ └── Function Modules
└── 全局数据无特殊保护
⚠️过程式模型的风险
主程序层面上,全局数据对象没有特殊保护。任何地方都可以读写全局变量。

使用函数组实现封装

函数组提供了一定程度的封装:

  • 函数组加载到独立内存区域
  • 主程序只能通过函数模块访问函数组的数据
  • 不能直接访问函数组的全局数据
1
2
3
4
5
6
7
8
9
┌─────────────────┐     ┌──────────────────┐
│ Main Program │ │ Function Group │
│ │────→│ Function Modules │
│ │调用 │ ├ INC_SPEED() │
│ │ │ ├ DEC_SPEED() │
│ │ │ └ GET_SPEED() │
│ │ ✗ │ Global Data: │
│ │────→│ SPEED (不可直接) │
└─────────────────┘ └──────────────────┘

OO编程的关键特性

特性 说明
封装 对象保护自身数据,外部只能通过公有方法访问
多实例化 同一个类可以创建多个独立的运行时实例
继承 子类继承父类的特征,可以扩展和修改
多态 同一接口可以有不同的实现

多实例化 — OO的核心优势

函数组的局限:一个程序中一个函数组只有一个实例。如果要管理多个”车辆”,需要额外的编程和管理工作。

OO编程:可以轻松创建多个独立对象实例:

1
2
3
4
5
6
7
CLASS LCL_VEHICLE 定义
├── 对象1: car (make=BMW, speed=100)
├── 对象2: truck (make=VW, speed=60)
├── 对象3: bus (make=Mercedes, speed=80)
└── 对象4: car (make=Audi, speed=120)
→ 所有对象共享相同数据结构和功能
→ 但各自有独立的数据值

内存管理

1
2
3
4
5
6
7
8
┌── Internal Session ──────────────────────┐
│ Main Program │
│ ├── 对象1 (LCL_VEHICLE) [独立数据区] │
│ ├── 对象2 (LCL_VEHICLE) [独立数据区] │
│ ├── 对象3 (LCL_VEHICLE) [独立数据区] │
│ └── 函数组 [独立数据区] │
│ → 所有区域相互隔离,数据受保护 │
└──────────────────────────────────────────┘

考试/测试模式

场景/关键词 答案
“函数组 vs 类的区别” 函数组只能单实例,类支持多实例化
“封装在过程式中的实现” 函数组可以封装,但不够灵活
“OO的主要优势” 封装 + 多实例 + 继承 + 多态
“对象存储在哪里” 与主程序相同的内部会话中,但数据区分离