SAP ABAP - Ereditarietà

Uno dei concetti più importanti nella programmazione orientata agli oggetti è quello dell'ereditarietà. L'ereditarietà ci consente di definire una classe in termini di un'altra classe, il che semplifica la creazione e la manutenzione di un'applicazione. Ciò offre anche l'opportunità di riutilizzare la funzionalità del codice e tempi di implementazione rapidi.

Quando si crea una classe, invece di scrivere membri e metodi di dati completamente nuovi, il programmatore può stabilire che la nuova classe erediti i membri di una classe esistente. Questa classe esistente è chiamatabase class o super classe la nuova classe è indicata come derived class o sub class.

  • Un oggetto di una classe può acquisire le proprietà di un'altra classe.

  • La classe derivata eredita i dati e i metodi di una super classe. Tuttavia, possono sovrascrivere metodi e anche aggiungere nuovi metodi.

  • Il vantaggio principale dell'ereditarietà è la riutilizzabilità.

La relazione di ereditarietà viene specificata utilizzando l'aggiunta "INHERITING FROM" nell'istruzione di definizione della classe.

La seguente è la sintassi:

CLASS <subclass> DEFINITION INHERITING FROM <superclass>.

Esempio

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.

Il codice precedente produce il seguente output:

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

Controllo degli accessi ed ereditarietà

Una classe derivata può accedere a tutti i membri non privati ​​della sua classe base. Pertanto i membri della super classe che non dovrebbero essere accessibili alle funzioni membro delle sottoclassi dovrebbero essere dichiarati privati ​​nella super classe. Possiamo riassumere le diverse tipologie di accesso a seconda di chi può accedervi nel modo seguente:

Accesso Pubblico Protetto Privato
Stessi vitelli
Classe derivata No
Fuori classe No No

Quando si deriva una classe da una super classe, è possibile ereditarla tramite eredità pubblica, protetta o privata. Il tipo di ereditarietà è specificato dallo specificatore di accesso come spiegato sopra. Difficilmente utilizziamo l'eredità protetta o privata, ma l'eredità pubblica è comunemente usata. Le seguenti regole vengono applicate durante l'utilizzo di diversi tipi di ereditarietà.

  • Public Inheritance- Quando si deriva una classe da una super classe pubblica, i membri pubblici della superclasse diventano membri pubblici della sottoclasse e i membri protetti della superclasse diventano membri protetti della sottoclasse. I membri privati ​​della super classe non sono mai accessibili direttamente da una sottoclasse, ma è possibile accedervi tramite chiamate ai membri pubblici e protetti della super classe.

  • Protected Inheritance - Quando derivano da una superclasse protetta, i membri pubblici e protetti della superclasse diventano membri protetti della sottoclasse.

  • Private Inheritance - Quando derivano da una superclasse privata, i membri pubblici e protetti della superclasse diventano membri privati ​​della sottoclasse.

Ridefinire i metodi in una sottoclasse

I metodi della super classe possono essere reimplementati nella sottoclasse. Poche regole per ridefinire i metodi -

  • L'istruzione di ridefinizione per il metodo ereditato deve essere nella stessa sezione della definizione del metodo originale.

  • Se si ridefinisce un metodo, non è necessario immettere nuovamente la sua interfaccia nella sottoclasse, ma solo il nome del metodo.

  • All'interno del metodo ridefinito, è possibile accedere ai componenti della superclasse diretta utilizzando il super riferimento.

  • Lo pseudo riferimento super può essere utilizzato solo in metodi ridefiniti.

Esempio

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.

Dopo aver eseguito F8, se inseriamo i valori 9 e 10, il codice sopra produce il seguente output:

Redefinition Demo 
29