Title: Nessun titolo diapositiva
1Derivazione tra classi
2Classe D derivata da B
- class B //CLASSE BASE int x void G()
x x 20
- class D extends B //CLASSE
DERIVATA void H() x x 10
3Principi fondamentali della derivazione
Principio 1
- Tutte le proprietà definite per la classe base
vengono implicitamente definite anche nella
classe derivata
4Principi fondamentali della derivazione
Principio 1
- cioè vengono ereditate da questultima.
- Ad esempio la classe D ha il campo dati int x e
la funzione void G()
5Principi fondamentali della derivazione
Principio 2
- La classe derivata può avere ulteriori proprietà
- Ad esempio la classe D ha in più, rispetto alla
classe base B, la funzione void H()
6Principi fondamentali della derivazione
Principio 3
- Ogni oggetto della classe derivata è anche un
oggetto della classe base
- cioè si può usare un oggetto della classe
derivata in ogni situazione/contesto in cui si
può usare un oggetto della classe base
7Principi fondamentali della derivazione
Principio 3
- static void stampa(B bb) System.out.println(
bb.x) - D d new D()d.G() //OKstampa(d) //OK
- la classe D è compatibile con la classe B.
8Principi fondamentali della derivazione
Principio 4
- Non è vero che un oggetto della classe base è
anche un oggetto della classe derivata
- non è possibile usare un oggetto della classe
base laddove si può usare un oggetto della classe
derivata.
9Principi fondamentali della derivazione
Principio 4
- B b new B()b.H() //NO non ha il campo
H()D d b //NO B non è compatibile con Db
new D() //OK D è compatibile con B
10Gerarchie di classi
in profondità
- Una classe derivata può fungere da classe base
per ulteriori derivazioni
- class B class D extends B class E extends
D
11Gerarchie di classi in ampiezza
- Una classe può avere un numero qualsiasi di
classi derivate
- class B class D extends B class Dbis
extends B
12Gerarchie di classi esempio
- Ogni classe ha solo una classe base
- no ereditarietà multipla in Java
13Casting
14Riferimenti di diverse classi possono denotare lo
stesso oggetto
- class B class D extends B int x_d D d
new D()d.x_d 10 B b d //OK b e d
denotano lo stesso ogg.b.x_d 20 //NO x_d
non è un campo di B! //type checking statico
15Casting per accedere ai campi della classe
derivata
- class B class D extends B int x_d D d
new D()d.x_d 10 B b d //OK b e d
denotano lo stesso ogg.((D)b).x_d 20 //OK
(D)b è un riferimento di tipo D
16Il casting tra classi lungo lo stesso cammino in
una gerarchia di derivazione è
- sempre sintatticamente corretto (non vengono
mai rivelati errori di compilazione)
- ma è responsabilità del programmatore che sia
anche semanticamente corretto
17Esempio
- class B class D extends B int x_d B b
new B()D d (D)b //OK a tempo di
compilazione, ma //NO a runtime
(ClassCastException)d.x_d 10 //NOTA x_d
non esiste nelloggetto //denotato da d!
18Livello di accesso protected
19- Una classe D derivata da unaltra classe B, anche
se in un package diverso, ha una relazione
speciale con questultima
- non è un cliente qualsiasi di B in quanto
vogliamo poter usare oggetti di D al posto dei
quelli di B
20- Per questo motivo può essere che B voglia mettere
a disposizione di D dei campi che non sono a
disposizione di clienti generici di B
- per fare ciò si dicharano detti campi protected
- garantendo laccesso ad essi alle classi
derivate, ma bloccandone laccesso ai clienti
generici.
21Costruttori delle classi derivate
22- Anche gli oggetti delle classi derivate sono
creati chiamando un costruttore
- tale costruttore però deve inizializzare anche i
campi dati ereditati
- alcuni dei quali sono inaccessibili dalla
classe derivata (es. private)
23- per fare ciò Java richiede di invocare un
costruttore della classe base nei costruttori
della classe derivata
- mediante il costrutto super() che deve essere
la prima istruzione eseguibile del corpo del
costruttore della classe derivata.
24Esempio
EsempioCostuttori1.java
25Qualora un costruttore della classe derivata non
contiene linvocazione esplicita di un
costruttore
- viene invocato automaticamente il costruttore
senza parametri
- se questultimo non è presente viene generato un
errore.
26Esempio
EsempioCostuttori2.java
27Se una classe derivata non contiene costruttori
- Java ne fornisce automaticamente un costruttore
standard senza parametri
- che invoca il costruttore senza parametri della
classe base...
- e lascia i campi dati della classe derivata al
loro valore di default.
28Esempio
EsempioCostuttori3.java
29Costrutto this()
- da utilizzare in modo analogo a super()
- è uninvocazione esplicita ad un altro
costruttore della stessa classe
- permette si riusare codice già scritto
30Esempio
PersonaThis.java
31Principi fondamentali della derivazione
- Principio 1 la classe derivata eredita le
proprietà (campi) della classe base - Principio 2 può avere ultriori proprietà
- Principo 3 è compatibile con la classe base
- Principio 4 ma non il viceversa