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 | sì | sì | sì |
Classe derivata | sì | sì | No |
Fuori classe | sì | 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