SAP ABAP 类
类用于指定对象的形式,它将数据表示和处理该数据的方法组合到一个包中。
类中的数据和函数称为 类成员。
类定义和实现
定义类时,定义了数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类名的含义、类的对象将由什么组成,以及可以对此类对象执行什么操作。也就是说,它定义了对象的抽象特征,例如属性、字段和属性。
以下是定义类的语法:
CLASS <class_name> DEFINITION.
..........
..........
ENDCLASS.
类定义从关键字 CLASS
开始,后跟类名、定义和类主体。类的定义可以包含类的各种组件,例如属性、方法和事件。当我们在类声明中声明方法时,方法实现必须包含在类实现中。
以下是实现类的语法:
CLASS <class_name> IMPLEMENTATION.
...........
..........
ENDCLASS.
属性
属性是类的数据字段,可以具有任何数据类型,如 C、I、F 和 N。它们在类声明中声明。
这些属性可以分为两类:
实例属性 定义对象的实例特定状态。不同对象的状态不同。实例属性是使用
DATA
语句声明的。静态属性 定义一个类的公共状态,该状态由该类的所有实例共享。也就是说,如果更改了类的一个对象中的静态属性,则该更改对该类的所有其他对象也是可见的。静态属性是使用
CLASS-DATA
语句声明的。
方法
方法是表示类中对象行为的函数或过程。该类的方法可以访问该类的任何属性。方法的定义还可以包含参数,以便在调用方法时为这些参数提供值。
方法的定义在类声明中声明,并在类的实现部分实现。METHOD
和 ENDMETHOD
语句用于定义方法的实现部分。
以下是实现方法的语法:
METHOD <m_name>.
..........
..........
ENDMETHOD.
在此语法中,<m_name> 表示方法的名称。
CALL METHOD
语句调用方法。访问属性和方法
类组件可以在公共(public)、私有(private)或受保护(protected)的可见性部分中定义,这些部分控制如何访问这些组件。私有可见性部分用于拒绝从类外部访问组件。此类组件只能从类内部访问,例如方法。
可以从任何上下文访问在公共可见性部分中定义的组件。默认情况下,类的所有成员都是私有的。一般来说,我们在私有部分中定义数据,在公共部分中定义相关方法,以便可以从类外调用它们,如下面的程序所示。
- 类的 公共 部分中声明的属性和方法可以由该类和程序的任何其他子类访问。
- 当属性和方法在类的 受保护 部分中声明时,这些属性和方法只能由该类和子类(派生类)访问。
- 当属性和方法在类的 私有 部分中声明时,这些属性和方法只能由该类访问,而不能由任何其他类访问。
实例
Report ZAccess1.
CLASS class1 Definition.
PUBLIC Section.
Data: text1 Type char25 Value 'Public Data'.
Methods meth1.
PROTECTED Section.
Data: text2 Type char25 Value 'Protected Data'.
PRIVATE Section.
Data: text3 Type char25 Value 'Private Data'.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Write: / 'Public Method:',
/ text1,
/ text2,
/ text3.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data: Objectx Type Ref To class1.
Create Object: Objectx.
CALL Method: Objectx→meth1.
Write: / Objectx→text1.
结果如下:
Public Method:
Public Data
Protected Data
Private Data
Public Data
静态属性
静态属性用语句 CLASS-DATA
声明。所有对象或实例都可以使用类的静态属性。静态属性通过类名直接访问,比如 class_name⇒name_1 = 'Some Text'
实例
下面是一个程序,我们想打印行号为 4 到 8 次的文本。我们定义了一个类 class1
,在公共部分我们声明了 CLASS-DATA
(静态属性)和一个方法。在实现了类和方法之后,我们在选择事件开始时直接访问静态属性。然后我们只需创建类的实例并调用该方法。
Report ZStatic1.
CLASS class1 Definition.
PUBLIC Section.
CLASS-DATA: name1 Type char45,
data1 Type I.
Methods: meth1.
ENDCLASS.
CLASS class1 Implementation.
Method meth1.
Do 4 Times.
data1 = 1 + data1.
Write: / data1, name1.
EndDo.
Skip.
EndMethod.
ENDCLASS.
Start-Of-Selection.
class1⇒name1 = 'ABAP Object Oriented Programming'.
class1⇒data1 = 0.
Data: Object1 Type Ref To class1,
Object2 Type Ref To class1.
Create Object: Object1, Object2.
CALL Method: Object1→meth1,
Object2→meth1
结果如下:
构造函数
构造函数是在创建对象或访问类组件时自动调用的特殊方法。每当创建一个对象时,构造函数就会被触发,但我们需要调用一个方法来触发通用方法。在下面的示例中,我们声明了两个公共方法 method1
和 constructor
。这两种方法都有不同的操作。在创建类的对象时,构造函数方法触发其操作。
实例
Report ZConstructor1.
CLASS class1 Definition.
PUBLIC Section.
Methods: method1, constructor.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Write: / 'This is Method1'.
EndMethod.
Method constructor.
Write: / 'Constructor Triggered'.
EndMethod.
ENDCLASS.
Start-Of-Selection.
Data Object1 Type Ref To class1.
Create Object Object1.
结果如下:
Constructor Triggered
方法中的运算符 ME
当您在类的公共部分声明任何类型的变量时,您可以在任何其他实现中使用它。可以在公共部分用初始值声明变量。我们可以在具有不同值的方法中再次声明变量。当我们在方法中写入变量时,系统将输出更改后的值。为了反映变量的先前值,我们必须使用 ME
运算符。
在这个程序中,我们声明了一个公共变量 text1
,并用一个值启动。我们再次声明了相同的变量,但实例化了不同的值。在该方法中,我们使用 ME
运算符编写该变量,以获取先前启动的值。我们通过直接声明来获得更改后的值。
实例
Report ZMEOperator1.
CLASS class1 Definition.
PUBLIC Section.
Data text1 Type char25 Value 'This is CLASS Attribute'.
Methods method1.
ENDCLASS.
CLASS class1 Implementation.
Method method1.
Data text1 Type char25 Value 'This is METHOD Attribute'.
Write: / ME→text1,
/ text1.
ENDMethod.
ENDCLASS.
Start-Of-Selection.
Data objectx Type Ref To class1.
Create Object objectx.
CALL Method objectx→method1.
结果如下:
This is CLASS Attribute
This is METHOD Attribute