SAP ABAP - 类



类用于指定对象的表单,它将数据表示和操作该数据的方法组合到一个简洁的包中。类中的数据和函数称为类的成员

类定义和实现

定义类时,您定义了数据类型的蓝图。这实际上并没有定义任何数据,但它确实定义了类名称的含义、类对象将包含的内容以及可以在此类对象上执行的操作。也就是说,它定义了对象的抽象特征,例如属性、字段和特性。

以下语法显示了如何定义类:

CLASS <class_name> DEFINITION. 
.......... 
.......... 
ENDCLASS.

类定义以关键字 CLASS 后跟类名、DEFINITION 和类主体开头。类的定义可以包含类的各种组件,例如属性、方法和事件。当我们在类声明中声明一个方法时,方法实现必须包含在类实现中。以下语法显示了如何实现类:

CLASS <class_name> IMPLEMENTATION. 
........... 
.......... 
ENDCLASS.

注意 - 类的实现包含其所有方法的实现。在 ABAP Objects 中,类的结构包含属性、方法、事件、类型和常量等组件。

属性

属性是类的字段,可以具有任何数据类型,例如 C、I、F 和 N。它们在类声明中声明。这些属性可以分为两类:实例属性和静态属性。实例属性定义对象的特定实例状态。不同对象的州是不同的。实例属性是通过使用 DATA 语句声明的。

静态属性定义类的通用状态,该状态由类的所有实例共享。也就是说,如果您更改类的一个对象中的静态属性,则更改对类的所有其他对象也可见。静态属性是通过使用 CLASS-DATA 语句声明的。

方法

方法是表示类中对象行为的函数或过程。类的方法可以访问类的任何属性。方法的定义还可以包含参数,以便在调用方法时可以向这些参数提供值。方法的定义在类声明中声明并在类的实现部分实现。METHOD 和 ENDMETHOD 语句用于定义方法的实现部分。以下语法显示了如何实现方法:

METHOD <m_name>. 
.......... 
.......... 
ENDMETHOD.

在此语法中,<m_name> 表示方法的名称。注意 - 您可以使用 CALL METHOD 语句调用方法。

访问属性和方法

类组件可以在控制如何访问这些组件的公共、私有或受保护的可见性部分中定义。私有可见性部分用于拒绝从类外部访问组件。此类组件只能从类内部(例如方法)访问。

在公共可见性部分中定义的组件可以从任何上下文中访问。默认情况下,类的所有成员都是私有的。实际上,我们在私有部分中定义数据,在公共部分中定义相关方法,以便可以从类外部调用它们,如下面的程序所示。

  • 在类中公共部分声明的属性和方法可以被该类和任何其他类、程序的子类访问。

  • 当属性和方法在类中受保护部分声明时,只有该类和子类(派生类)才能访问它们。

  • 当属性和方法在类中私有部分声明时,只有该类可以访问它们,其他任何类都不能访问它们。

示例

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(静态属性)和一个方法。在实现类和方法后,我们直接在 Start-Of-Selection 事件中访问静态属性。然后我们只需创建类的实例并调用方法。

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.

以上代码产生以下输出:

Static Attributes

构造函数

构造函数是特殊的方法,在创建对象或访问类的组件时自动调用。每当创建对象时都会触发构造函数,但我们需要调用方法来触发常规方法。在以下示例中,我们声明了两个公共方法 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
广告