定义局部类
学习目标
在全局类中定义局部类。
局部类
局部类和全局类
ABAP 中的类可以是本地类,也可以是全局类。

全局类集中存储,并包含在称为类池的自有资源库对象中。全局类可用作主程序。全局类还可以包含其他 ABAP 程序(包括其他全局类)重用的逻辑。
局部类定义为 ABAP 程序的一部分,例如全局类。只能在定义它们的程序或类中使用它们。局部类对于仅在单个程序中需要的实体或函数很有用。
局部类和全局类的 ABAP 语法几乎相同。在本课程中,您将使用全局类中的局部类。具有方法 if_oo_adt_classrun~main 的全局类将仅用作一种主程序。
全局类中的局部类
如下图所示,在 ADT 中打开全局类时,首先关注全局类标签。在此,您可以找到全局类本身的源代码。要查看或输入局部类的源代码,必须导航到局部类型标签。

ADT 为本地类提供源代码模板。要使用此模板,请执行以下操作:
在 ABAP 编辑器中,键入 lcl 并按 Ctrl + 空格 键。
从显示的列表中选择 lcl - Local class ,然后按 Enter 。
调整新局部类的名称。
对于本课程中的类,必须从 CLASS…DEFINITION 语句中移除创建专用附加项。
如何在全局类中创建局部类。
演示:观看演示(SAP 官方交互式练习)
属性
ABAP 中类的源代码

在 ABAP 中,类的源代码有两个部分 - 定义和实施。类的定义部分最多细分为三个部分,称为类的可见性部分。
定义
类的定义部分包含类中所有元素的定义和声明,即类型、常量、属性和方法。它以 CLASS <class_name> DEFINITION. 开头,以 ENDCLASS 结尾。
实施
类的实施部分包含类的可执行代码,即其方法的实施。它以 CLASS <class_name> IMPLEMENTATION 开头,以 ENDCLASS 结尾。类的实施部分是可选的。只要类定义包含可执行方法,它就会成为强制性的。
可见性部分
类的每个可见性部分都从语句 PUBLIC SECTION、PROTECTED SECTION、PRIVATE SECTION 之一开始,并在下一部分开始时隐式结束。最后一部分以语句 ENDCLASS 结束。类的所有声明必须在其中一个部分内。换句话说:在类定义的开头和第一节的开头之间不允许声明。
声明所在的部分定义了类的已声明元素的可见性。
类的三个可见性部分是可选的;如果不需要特定部分,则无需声明。但如果类定义由多个部分组成,则必须遵循顺序 PUBLIC SECTION - PROTECTED SECTION - PRIVATE SECTION。
类的定义部分
以下视频显示了可在类中定义的不同种类的组件。您可以在类的任何可见性部分中定义这些组件。
视频:本节含 SAP 官方视频(视频 ID
1_bh85qgb5),需在 learning.sap.com 在线观看。
示例:航班转机等级的属性

让我们开始在 ABAP 中实施 UML 模型,从 开始采用连接类的属性。要声明属性,请在相应的可见性部分中使用 DATA 语句。
属性 conn_counter 会加下划线,表示静态属性。可使用 CLASS-DATA 语句声明静态属性。CLASS-DATA 的语法与 DATA 的语法相同。
注意
我们此时从公共属性开始。稍后,在课程中讨论封装时,我们会将它们转换为私有属性。
定义局部类
在本练习中,在全局类中定义局部类。
模板:
无
解决方案:
/LRN/CL_S4D400_CLS_LOCAL_CLASS(全局类)
任务 1: 创建全局类
在您自己的包中,创建新的 ABAP 类。
步骤
创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类(建议名称:
ZCL_##_LOCAL_CLASS,其中 ## 代表组编号)。选择 文件→新建→ABAP 类 。
在包字段中输入包的名称。在名称字段中,输入名称
ZCL_##_LOCAL_CLASS,其中##是您的组编号。输入描述。在接口组框中,选择添加。
输入
IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。选择下一步。
选择传输请求,然后选择完成。
任务 2: 定义局部类
定义局部类 lcl_connection 并声明一些公共属性。
步骤
在全局类中,创建新的局部类
lcl_connection。使用代码完整化生成代码,但请确保从生成的代码中移除create private附加项。切换到局部类型标签。
在编辑器中键入
lcl并按 **Ctrl + 空格**键。在弹出窗口中双击 lcl - class。
虽然在
class lcl definition create private.行中的lcl周围仍然有一个可见的框架,但将类的名称填写为lcl_connection。删除代码行末尾的单词
create private``class lcl_connection definition.。在局部类
lcl_connection中,声明以下公共属性:
属性
属性名称 |
范围 |
数据类型 |
|---|---|---|
|
实例 |
/DMO/CARRIER_ID |
|
实例 |
/DMO/CONNECTION_ID |
|
静态 |
I |
在
PUBLIC SECTION.行之后和第PROTECTED SECTION.行之前,添加以下代码:
DATA carrier_id TYPE /dmo/carrier_id.
DATA connection_id TYPE /dmo/connection_id.
CLASS-DATA conn_counter TYPE i.
激活此类。
注意
由于 if_oo_adt_classrun~main 方法不包含可执行代码,因此此时没有要测试或调试的内容。
按
Ctrl + F3激活类。将本地类型标签上的代码与模型解决方案中的以下提取内容进行比较:
*"* use this source file for the definition and implementation of
*"* local helper classes, interface definitions and type
*"* declarations
CLASS lcl_connection DEFINITION.
PUBLIC SECTION.
DATA carrier_id TYPE /dmo/carrier_id.
DATA connection_id TYPE /dmo/connection_id.
CLASS-DATA conn_counter TYPE i.
PROTECTED SECTION.
PRIVATE SECTION.
ENDCLASS.
CLASS lcl_connection IMPLEMENTATION.
ENDCLASS.