定义局部类

学习目标

  • 在全局类中定义局部类。

局部类

局部类和全局类

ABAP 中的类可以是本地类,也可以是全局类。

全局类集中存储,并包含在称为类池的自有资源库对象中。全局类可用作主程序。全局类还可以包含其他 ABAP 程序(包括其他全局类)重用的逻辑。

局部类定义为 ABAP 程序的一部分,例如全局类。只能在定义它们的程序或类中使用它们。局部类对于仅在单个程序中需要的实体或函数很有用。

局部类和全局类的 ABAP 语法几乎相同。在本课程中,您将使用全局类中的局部类。具有方法 if_oo_adt_classrun~main 的全局类将仅用作一种主程序。

全局类中的局部类

如下图所示,在 ADT 中打开全局类时,首先关注全局类标签。在此,您可以找到全局类本身的源代码。要查看或输入局部类的源代码,必须导航到局部类型标签。

ADT 为本地类提供源代码模板。要使用此模板,请执行以下操作:

  1. 在 ABAP 编辑器中,键入 lcl 并按 Ctrl + 空格 键。

  2. 从显示的列表中选择 lcl - Local class ,然后按 Enter 。

  3. 调整新局部类的名称。

对于本课程中的类,必须从 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 类。

步骤

  1. 创建一个实施接口 IF_OO_ADT_CLASSRUN 的新全局类(建议名称:ZCL_##_LOCAL_CLASS,其中 ## 代表组编号)。

  2. 选择 文件新建ABAP 类

  3. 在包字段中输入的名称。在名称字段中,输入名称 ZCL_##_LOCAL_CLASS,其中 ## 是您的组编号。输入描述。

  4. 接口组框中,选择添加

  5. 输入 IF_OO_ADT_CLASSRUN。当接口出现在命中列表中时,双击该接口将其添加到类定义中。

  6. 选择下一步

  7. 选择传输请求,然后选择完成

任务 2: 定义局部类

定义局部类 lcl_connection 并声明一些公共属性。

步骤

  1. 在全局类中,创建新的局部类 lcl_connection。使用代码完整化生成代码,但请确保从生成的代码中移除 create private 附加项。

  2. 切换到局部类型标签。

  3. 在编辑器中键入 lcl 并按 **Ctrl + 空格**键。

  4. 在弹出窗口中双击 lcl - class

  5. 虽然在 class lcl definition create private. 行中的 lcl 周围仍然有一个可见的框架,但将类的名称填写为 lcl_connection

  6. 删除代码行末尾的单词 create private``class lcl_connection definition.

  7. 在局部类 lcl_connection 中,声明以下公共属性:

属性

属性名称

范围

数据类型

carrier_id

实例

/DMO/CARRIER_ID

connection_id

实例

/DMO/CONNECTION_ID

conn_counter

静态

I

  1. PUBLIC SECTION. 行之后和第 PROTECTED SECTION. 行之前,添加以下代码:

DATA carrier_id    TYPE /dmo/carrier_id.
DATA connection_id TYPE /dmo/connection_id.
CLASS-DATA conn_counter TYPE i.
  1. 激活此类。

注意

由于 if_oo_adt_classrun~main 方法不包含可执行代码,因此此时没有要测试或调试的内容。

  1. Ctrl + F3 激活类。

  2. 本地类型标签上的代码与模型解决方案中的以下提取内容进行比较:

*"* 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.