SAP ABAP - Dziedziczenie

Jedną z najważniejszych koncepcji programowania obiektowego jest dziedziczenie. Dziedziczenie pozwala nam zdefiniować klasę pod względem innej klasy, co ułatwia tworzenie i utrzymywanie aplikacji. Daje to również możliwość ponownego wykorzystania funkcjonalności kodu i szybkiego czasu implementacji.

Podczas tworzenia klasy, zamiast pisać zupełnie nowe składowe i metody danych, programista może wyznaczyć, że nowa klasa powinna dziedziczyć elementy już istniejącej klasy. Ta istniejąca klasa nosi nazwębase class lub super class, a nowa klasa jest nazywana derived class lub sub class.

  • Obiekt jednej klasy może uzyskać właściwości innej klasy.

  • Klasa pochodna dziedziczy dane i metody superklasy. Mogą jednak nadpisywać metody, a także dodawać nowe metody.

  • Główną zaletą dziedziczenia jest możliwość ponownego wykorzystania.

Relacja dziedziczenia jest określana za pomocą dodatku „INHERITING FROM” do instrukcji definicji klasy.

Poniżej znajduje się składnia -

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Przykład

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.

Powyższy kod daje następujące dane wyjściowe -

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

Kontrola dostępu i dziedziczenie

Klasa pochodna może uzyskać dostęp do wszystkich nieprywatnych elementów członkowskich swojej klasy bazowej. Zatem elementy składowe superklasy, które nie powinny być dostępne dla funkcji składowych podklas, powinny być zadeklarowane jako prywatne w superklasie. Możemy podsumować różne typy dostępu według tego, kto może uzyskać do nich dostęp w następujący sposób -

Dostęp Publiczny Chroniony Prywatny
Same calss tak tak tak
Klasy pochodnej tak tak Nie
Poza klasą tak Nie Nie

Wyprowadzając klasę z superklasy, można ją dziedziczyć poprzez dziedziczenie publiczne, chronione lub prywatne. Typ dziedziczenia jest określony przez specyfikator dostępu, jak wyjaśniono powyżej. Rzadko używamy dziedziczenia chronionego lub prywatnego, ale powszechnie stosowane jest dziedziczenie publiczne. Podczas korzystania z różnych rodzajów dziedziczenia obowiązują następujące zasady.

  • Public Inheritance- Podczas wyprowadzania klasy z publicznej superklasy, publiczni członkowie superklasy stają się publicznymi członkami podklasy, a chronieni członkowie superklasy stają się chronionymi członkami podklasy. Prywatni członkowie superklasy nigdy nie są dostępni bezpośrednio z klasy podrzędnej, ale można uzyskać do nich dostęp poprzez wywołania publiczne i chronione członkowie superklasy.

  • Protected Inheritance - W przypadku wyprowadzenia z chronionej superklasy, publiczni i chronieni członkowie superklasy stają się chronionymi członkami podklasy.

  • Private Inheritance - W przypadku wyprowadzenia z prywatnej superklasy, publiczni i chronieni członkowie superklasy stają się prywatnymi członkami podklasy.

Przedefiniowanie metod w podklasie

Metody klasy super można ponownie zaimplementować w podklasie. Kilka zasad redefiniowania metod -

  • Instrukcja redefinicji metody dziedziczonej musi znajdować się w tej samej sekcji, co definicja metody oryginalnej.

  • Jeśli przedefiniujesz metodę, nie musisz ponownie wprowadzać jej interfejsu w podklasie, a jedynie nazwę metody.

  • W ramach przedefiniowanej metody można uzyskać dostęp do komponentów bezpośredniej superklasy za pomocą super odwołania.

  • Pseudo odwołanie super może być używane tylko w przedefiniowanych metodach.

Przykład

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.

Po wykonaniu F8, jeśli wprowadzimy wartości 9 i 10, powyższy kod daje następujący wynik -

Redefinition Demo 
29