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
廣告