2. 2
Agenda del corso
• Dai function module agli oggetti
• Definizione di una classe
• Oggetti e metodi
• Incapsulamento, ereditarietà, polimorfismo
• Interfacce
• Eventi
3. 3
Agenda del corso
• Dai function module agli oggetti
• Definizione di una classe
• Oggetti e metodi
• Incapsulamento, ereditarietà, polimorfismo
• Interfacce
• Eventi
4. Incapsulamento
• Con il termine incapsulamento si indica la proprietà
degli oggetti di incorporare al loro interno sia gli
attributi che i metodi, cioè le caratteristiche e i
comportamenti dell’oggetto.
• Gli attributi e i metodi sono incapsulati nell’oggetto.
In questo modo tutte le informazioni utili che
riguardano un oggetto sono al suo interno.
4
5. Incapsulamento
Semplificazione
• Un oggetto viene utilizzato attraverso i metodi che
esso mette a disposizione
• Per ogni metodo vengono indicati anche il numero
e il tipo dei parametri di input e di output
• In questo modo chi utilizza l’oggetto può sapere
quali metodi possono essere invocati, quali sono i
parametri da passare e che cosa ricaverà come
valore di ritorno
5
6. Incapsulamento
Sicurezza
• Per poter leggere o modificare il valore di un
attributo, si dovrebbe utilizzare un metodo che
esegue l’operazione richiesta
• Questo garantisce l’information hiding, ma
comporta che per ogni attributo dell’oggetto siano
definiti il metodo per leggere e il metodo per
modificare il suo valore
6
7. Incapsulamento
Sicurezza
• Nell’ABAP come in altri linguaggi è comunque
possibile accedere e manipolare gli attributi in
maniera diretta
• Questa modalità di accesso agli attributi viola la
regola dell’information hiding, perché gli attributi
non restano più nascosti all’interno dell’oggetto, ma
offre la facilitazione di poter manipolare gli attributi
senza usare i metodi
7
8. Ereditarietà
• L’ereditarietà è una delle più importanti
caratteristiche della programmazione ad oggetti
• Essa è lo strumento che permette di costruire
nuove classi utilizzando quelle già sviluppate
8
9. Ereditarietà
• Quando una classe viene creata attraverso il
meccanismo di ereditarietà a partire da un’altra
classe, essa riceve in eredità tutti gli attributi e i
metodi della classe generatrice
• Questo incrementa notevolmente le possibilità di
riutilizzo del codice
9
10. Ereditarietà
• La classe che è stata derivata da un’altra usando
l’ereditarietà prende il nome di sottoclasse. La
classe generatrice di una sottoclasse si chiama
superclasse
• Queste relazioni tra le classi individuano una
gerarchia che nasce da un processo di
specializzazione
10
11. Ereditarietà
Mezzi di trasporto
Veicoli a motore Mezzi non a motore
Auto Moto Autobus Bicicletta Cavallo
11
• Le classi che si trovano in cima alla gerarchia sono
le più generali e man mano che si scende si
trovano classi più specializzate
12. Ereditarietà
• Nell’ ABAP tutte le classi possono essere
rappresentate in un albero di discendenza
• Il nodo più alto di questo albero è rappresentato
dalla superclasse OBJECT
• Se per una classe non viene specificata nessuna
ereditarietà allora questa erediterà in maniera
implicita direttamente dalla superclasse OBJECT
12
13. Ereditarietà
Esistono due tipi di ereditarietà
• Ereditarietà singola:
una sottoclasse eredita da una sola superclasse
13
15. Ereditarietà
• L’ereditarietà serve a definire nuove classi,
derivate da altre, che ereditano gli attributi e i
metodi, con la possibilità di ridefinirli o di
aggiungerne di nuovi
• La sottoclasse eredita dalla sopraclasse tutti gli
attributi e tutti i metodi con la possibilità di inserire
le differenze
15
16. Ereditarietà
• In ABAP per definire una sottoclasse che eredita
da una superclasse scriveremo
• CLASS <sottoclasse> DEFINITION INHERITING
FROM <superclasse>
16
17. Ereditarietà
• I componenti public e protected della superclasse
saranno visibili nella sottoclasse
• I componenti private resteranno visibili solo nella
superclasse
• E’ possibile assegnare ai componenti private della
sottoclasse gli stessi nomi di quelli della
superclasse
17
18. Ereditarietà
• I componenti STATIC (public e protected) di una
superclasse sono visibili dalla sottoclasse
• Si può accedere ad un componente STATIC
utilizzando entrambe le classi
…
super_classe=>attributo_statico
o …
sotto_classe=>attributo_statico
18
19. Ereditarietà
• La nuova classe si differenzia dalla sopraclasse in
due modi
• per estensione, quando la sottoclasse aggiunge
nuovi attributi e metodi che si sommano a quelli
ereditati
• per ridefinizione, quando la sottoclasse
ridefinisce i metodi ereditati
19
20. Ereditarietà
• Una classe definita ABSTRACT non può essere
istanziata
• Una classe astratta per essere utilizzata deve
essere ereditata da una sottoclasse
• Si può accedere comunque ai componenti static di
una classe astratta
20
21. Ereditarietà
• Se un metodo viene definito ABSTRACT allora
tutta la classe diventa ABSTRACT
…
METHODS <metodo> ABSTRACT.
• Un metodo astratto deve essere ridefinito all’interno
della sottoclasse
…
METHODS <metodo> REDEFINITION.
21
22. Ereditarietà
• Una classe astratta può dichiarare e implementare
metodi non astratti
• Questo permette di utilizzare questi metodi in una
sottoclasse senza doverli ridefinire
22
23. Ereditarietà
• Una classe definita FINAL non può essere
ereditata
• Tutti i metodi di una classe FINAL sono da
considerarsi FINAL a loro volta e non devono
essere dichiarati come FINAL
23
24. Ereditarietà
• Un metodo definito FINAL non può essere ridefinito
in una sottoclasse
…
METHODS <metodo> FINAL.
• Se in una classe c’è un metodo FINAL la classe
può essere ereditata ma quel metodo non può
essere ridefinito
24
25. Ereditarietà
• Un qualsiasi metodo non final può essere ridefinito
nella sottoclasse utilizzando la key-word
REDEFINITION
• I parametri del metodo tuttavia restano gli stessi
definiti nella superclasse
25
26. Ereditarietà
Ridefinire un metodo costruttore
• Il metodo CONSTRUCTOR non segue le regole di
ridefinizione normali
• Il CONSTRUCTOR è un metodo speciale in quanto
viene richiamato in automatico dalla CREATE
OBJECT e serve ad instanziare un oggetto
26
27. Ereditarietà
Ridefinire un metodo costruttore
• Il CONSTRUCTOR viene ereditato automatica-
mente dalla superclasse OBJECT e quindi può non
essere definito nella CLASS … DEFINITION
• Se si desidera ri-definirlo esso è l’unico metodo che
può avere indicati dei parametri di import perché
deve essere dichiarato nella CLASS …
DEFINITION
27
28. Ereditarietà
Ridefinire un metodo costruttore
• Quando una sottoclasse eredita da una
superclasse in cui è stato ri-definito il metodo
CONSTRUCTOR essa può a sua volta ri-definrlo
• Per ridefinire il CONSTRUCTOR in una sottoclasse
si seguono le stesse regole utilizzate per ri-definirlo
nella superclasse
28
29. Ereditarietà
Ridefinire un metodo costruttore
• Il CONSTRUCTOR deve essere definito nella
CLASS … DEFINITION
• I parametri del CONSTRUCTOR della sottoclasse
possono essere differenti da quelli della definiti
nella superclasse
• Nella CLASS … IMPLEMENTATION non si deve
usare RIDEFINITION
29
30. Ereditarietà
Ridefinire un metodo costruttore
• L’unica regola quando si ri-definisce un metodo
CONSTRUCTOR in una sottoclasse è che
all’interno dell’implementazione deve essere
richiamato il CONSTRUCTOR della superclasse
CALL METHOD SUPER->constructor
EXPORTING param1 = param
30
31. Ereditarietà
Ridefinire un metodo costruttore
• I costruttori static funzionano in maniera molto
simile a quelli instance
• Ci sono però due differenze fondamentali
• I costruttori static non possono mai avere
parametri
• Se un costruttore static viene ri-definito
all’interno di una sottoclasse non è necessario
richiamare il CONSTRUCTOR della superclasse
perché questo avviene in automatico
31
32. Ereditarietà
Referenziazione e utilizzo degli oggetti
• Ad un oggetto referenziato ad una superclasse
possono essere attribuiti i valori di un oggetto di
una sua sottoclasse
• Tuttavia esso potrà utilizzare solo i componenti
presenti nella superclasse
32
33. Ereditarietà
DATA: obj1 TYPE REF TO class1,
obj2 TYPE REF TO class2.
CREATE OBJECT obj2.
obj1 = obj2.
obj1->component_obj1. Corretto
obj1->component_obj2. Errore
33
34. Ereditarietà
Referenziazione e utilizzo degli oggetti
• Durante la CREATE OBJECT può essere
specificata la referenziazione alla classe con cui
l’oggetto viene istanziato.
• Questo modifica solo i componenti instance mentre
quelli static restano referenziati alla classe
presente nella dichiarazione
34
35. Ereditarietà
DATA: obj1 TYPE REF TO class1,
obj2 TYPE REF TO class2.
CREATE OBJECT obj1 TYPE class2.
CREATE OBJECT obj2.
obj1 = obj2.
obj1->component_obj1. Corretto
obj1->component_obj2. Corretto
35
36. Ereditarietà
• In generale una sottoclasse sarà sempre più
specializzata della sua superclasse
• L’attribuzione dei valori di una sottoclasse alla sua
superclasse viene definito “narrowing cast”
• Il narrowing cast è permesso e non genera errori di
consistenza
36
37. Ereditarietà
• L’attribuzione dei valori di una superclasse ad una
sottoclasse viene definito “widening cast”
• Il widening cast generalmente non è permesso e
può generare errori di consistenza
37
38. Ereditarietà
• Per realizzare un widening cast bisogna usare
l’operatore di assegnazione ?=
obj2 = obj1. Error
obj2 ?= obj1. ok
38
39. Ereditarietà
• Inoltre bisogna definire il controllo della condizione
di errore
CATCH SYSTEM-EXCEPTIONS.
MOVE_CAST_ERROR = 4.
obj2 = obj1.
ENDCATCH.
39
40. Polimorfismo
• Il polimorfismo indica la possibilità per i metodi di
assumere forme, cioè implementazioni, diverse
all’interno della gerarchia delle classi
40
41. Polimorfismo
• Utilizzando le proprietà del narrowing cast unite al
polimorfismo potremo richiamare un metodo da un
oggetto utilizzando a seconda delle necessità
implementazioni differenti
41