SAP ABAP - 繼承



面向物件程式設計中最重要的概念之一是繼承。繼承允許我們根據另一個類來定義一個類,這使得建立和維護應用程式更容易。這也提供了重用程式碼功能和加快實現時間的機會。

建立類時,程式設計師可以指定新類應該繼承現有類的成員,而不是編寫全新的資料成員和方法。這個現有類稱為**基類**或**超類**,新類稱為**派生類**或**子類**。

  • 一個類的物件可以獲取另一個類的屬性。

  • 派生類繼承超類的(資料和)方法。但是,它們可以覆蓋方法並新增新方法。

  • 繼承的主要優點是可重用性。

繼承關係使用類定義語句中的“INHERITING FROM”附加說明來指定。

以下是語法:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

示例

Report ZINHERITAN_1. 
CLASS Parent Definition. 
PUBLIC Section. 
Data: w_public(25) Value 'This is public data'. 
Methods: ParentM. 
ENDCLASS. 

CLASS Child Definition Inheriting From Parent. 
PUBLIC Section. 
Methods: ChildM. 
ENDCLASS. 

CLASS Parent Implementation. 
Method ParentM. 
Write /: w_public. 
EndMethod. ENDCLASS. 

CLASS Child Implementation. 
Method ChildM. 
Skip. 
Write /: 'Method in child class', w_public.
EndMethod. 
ENDCLASS. 

Start-of-selection. 
Data: Parent Type Ref To Parent, 
Child Type Ref To Child. 
Create Object: Parent, Child. 
Call Method: Parent→ParentM, 
child→ChildM.

以上程式碼產生以下輸出:

This is public data 
Method in child class 
This is public data

訪問控制和繼承

派生類可以訪問其基類的所有非私有成員。因此,超類成員不應被子類的成員函式訪問,應該在超類中宣告為私有。我們可以按照誰可以訪問它們來總結不同的訪問型別:

訪問 公共 受保護的 私有的
同一類
派生類
外部類

從超類派生類時,可以透過公共、受保護或私有繼承進行繼承。繼承型別由上面解釋的訪問說明符指定。我們幾乎不使用受保護或私有繼承,但公共繼承通常使用。使用不同型別的繼承時,會應用以下規則。

  • **公共繼承** - 從公共超類派生類時,超類的公共成員成為子類的公共成員,超類的受保護成員成為子類的受保護成員。超類的私有成員永遠不能直接從子類訪問,但可以透過呼叫超類的公共和受保護成員來訪問。

  • **受保護的繼承** - 從受保護的超類派生時,超類的公共和受保護成員成為子類的受保護成員。

  • **私有繼承** - 從私有超類派生時,超類的公共和受保護成員成為子類的私有成員。

在子類中重新定義方法

超類的方法可以在子類中重新實現。重新定義方法的一些規則:

  • 繼承方法的重新定義語句必須與原始方法的定義位於同一節。

  • 如果重新定義方法,則不需要在子類中再次輸入其介面,只需輸入方法名稱。

  • 在重新定義的方法中,可以使用 super 引用訪問直接超類的元件。

  • 偽引用 super 只能在重新定義的方法中使用。

示例

Report Zinheri_Redefine. 
CLASS super_class Definition. 
Public Section. 
Methods: Addition1 importing g_a TYPE I
                             g_b TYPE I
		   exporting g_c TYPE I.
ENDCLASS. 

CLASS super_class Implementation. 
Method Addition1. 
g_c = g_a + g_b. 
EndMethod. 
ENDCLASS. 

CLASS sub_class Definition Inheriting From super_class. 
Public Section. 
METHODS: Addition1 Redefinition. 
ENDCLASS. 

CLASS sub_class Implementation. 
Method Addition1. 
g_c = g_a + g_b + 10. 
EndMethod. 
ENDCLASS. 

Start-Of-Selection. 
Parameters: P_a Type I, P_b TYPE I. 
Data: H_Addition1 TYPE I. 
Data: H_Sub TYPE I. 
Data: Ref1 TYPE Ref TO sub_class. 
Create Object Ref1. 
Call Method Ref1→Addition1 exporting g_a = P_a 
                                     g_b = P_b
		           Importing g_c = H_Addition1. 
Write:/ H_Addition1.

執行 F8 後,如果我們輸入值 9 和 10,則以上程式碼會產生以下輸出:

Re-implemented os Sub Class
Redefinition Demo 
29
廣告