derivazione tra classi
DESCRIPTION
Derivazione tra classi. Classe 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; } }. Principi fondamentali della derivazione – Principio 1. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/1.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Derivazione tra classi
Derivazione tra classi
![Page 2: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/2.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
class B { //CLASSE BASE int x; void G() { x = x * 20; }}
class B { //CLASSE BASE int x; void G() { x = x * 20; }}
Classe D derivata da BClasse D derivata da B
class D extends B { //CLASSE DERIVATA void H() { x = x * 10; }}
class D extends B { //CLASSE DERIVATA void H() { x = x * 10; }}
![Page 3: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/3.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Tutte le proprietà definite per la classe base vengono implicitamente definite anche nella classe derivata …
Tutte le proprietà definite per la classe base vengono implicitamente definite anche nella classe derivata …
Principi fondamentali della derivazione – Principio 1Principi fondamentali della derivazione – Principio 1
![Page 4: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/4.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
… cioè vengono ereditate da quest’ultima.
… cioè vengono ereditate da quest’ultima.
Ad esempio la classe D ha il campo dati int x; e la funzione void G();
Ad esempio la classe D ha il campo dati int x; e la funzione void G();
Principi fondamentali della derivazione – Principio 1Principi fondamentali della derivazione – Principio 1
![Page 5: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/5.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Ad esempio la classe D ha in più, rispetto alla classe base B, la funzione void H();
Ad esempio la classe D ha in più, rispetto alla classe base B, la funzione void H();
La classe derivata può avere ulteriori proprietà …
La classe derivata può avere ulteriori proprietà …
Principi fondamentali della derivazione – Principio 2Principi fondamentali della derivazione – Principio 2
![Page 6: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/6.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
… cioè si può usare un oggetto della classe derivata in ogni situazione/contesto in cui si può usare 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
Principi fondamentali della derivazione – Principio 3Principi fondamentali della derivazione – Principio 3
Ogni oggetto della classe derivata è anche un oggetto della classe base …
Ogni oggetto della classe derivata è anche un oggetto della classe base …
![Page 7: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/7.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
… la classe D è compatibile con la classe B.
… la classe D è compatibile con la classe B.
Principi fondamentali della derivazione – Principio 3Principi fondamentali della derivazione – Principio 3 static void stampa(B bb) {
System.out.println(bb.x);} …
D d = new D();d.G(); //OKstampa(d); //OK
static void stampa(B bb) { System.out.println(bb.x);} …
D d = new D();d.G(); //OKstampa(d); //OK
![Page 8: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/8.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Non è vero che un oggetto della classe base è anche un oggetto della classe derivata …
Non è vero che un oggetto della classe base è anche un oggetto della classe derivata …
Principi fondamentali della derivazione – Principio 4Principi fondamentali della derivazione – Principio 4
… non è possibile usare un oggetto della classe base laddove si può usare un oggetto della classe derivata.
… non è possibile usare un oggetto della classe base laddove si può usare un oggetto della classe derivata.
![Page 9: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/9.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
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
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
Principi fondamentali della derivazione – Principio 4Principi fondamentali della derivazione – Principio 4
![Page 10: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/10.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Una classe derivata può fungere da classe base per ulteriori derivazioni …
Una classe derivata può fungere da classe base per ulteriori derivazioni …
Gerarchie di classi:Gerarchie di classi:
class B {…}class D extends B {…}class E extends D {…}
class B {…}class D extends B {…}class E extends D {…}
in profonditàin profondità
![Page 11: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/11.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Una classe può avere un numero qualsiasi di classi derivate …
Una classe può avere un numero qualsiasi di classi derivate …
Gerarchie di classi: in ampiezzaGerarchie di classi: in ampiezza
class B {…}class D extends B {…}class Dbis extends B {…}
class B {…}class D extends B {…}class Dbis extends B {…}
![Page 12: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/12.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Gerarchie di classi: esempioGerarchie di classi: esempio
CC
DD DbisDbis
EE
Ogni classe ha solo una classe base…Ogni classe ha solo una classe base…
…no ereditarietà multipla in Java…no ereditarietà multipla in Java
![Page 13: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/13.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
CastingCasting
![Page 14: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/14.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
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
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
Riferimenti di diverse classi possono denotare lo stesso oggetto
Riferimenti di diverse classi possono denotare lo stesso oggetto
![Page 15: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/15.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
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
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
Casting per accedere ai campi della classe derivataCasting per accedere ai campi della classe derivata
![Page 16: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/16.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
… sempre sintatticamente corretto (non vengono mai rivelati errori di compilazione) …
… sempre sintatticamente corretto (non vengono mai rivelati errori di compilazione) …
Il casting tra classi lungo lo stesso cammino in una gerarchia di derivazione è …
Il casting tra classi lungo lo stesso cammino in una gerarchia di derivazione è …
… ma è responsabilità del programmatore che sia anche semanticamente corretto …
… ma è responsabilità del programmatore che sia anche semanticamente corretto …
![Page 17: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/17.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
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 nell’oggetto //denotato da d!
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 nell’oggetto //denotato da d!
EsempioEsempio
![Page 18: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/18.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Livello di accesso protected
Livello di accesso protected
![Page 19: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/19.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Una classe D derivata da un’altra classe B, anche se in un package diverso, ha una relazione speciale con quest’ultima…
Una classe D derivata da un’altra classe B, anche se in un package diverso, ha una relazione speciale con quest’ultima…
…non è un cliente qualsiasi di B in quanto vogliamo poter usare oggetti di D al posto dei quelli di B…
…non è un cliente qualsiasi di B in quanto vogliamo poter usare oggetti di D al posto dei quelli di B…
…non coincide con B. …non coincide con B.
![Page 20: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/20.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
…per fare ciò si dicharano detti campi protected…
…per fare ciò si dicharano detti campi protected…
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 questo motivo può essere che B voglia mettere a disposizione di D dei campi che non sono a disposizione di clienti generici di B
…garantendo l’accesso ad essi alle classi derivate, ma bloccandone l’accesso ai clienti generici.
…garantendo l’accesso ad essi alle classi derivate, ma bloccandone l’accesso ai clienti generici.
![Page 21: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/21.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Costruttori delle classi derivate
Costruttori delle classi derivate
![Page 22: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/22.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Anche gli oggetti delle classi derivate sono creati chiamando un costruttore…
Anche gli oggetti delle classi derivate sono creati chiamando un costruttore…
…tale costruttore però deve inizializzare anche i campi dati ereditati…
…tale costruttore però deve inizializzare anche i campi dati ereditati…
… alcuni dei quali sono inaccessibili dalla classe derivata (es. private)…
… alcuni dei quali sono inaccessibili dalla classe derivata (es. private)…
![Page 23: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/23.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
…per fare ciò Java richiede di invocare un costruttore della classe base nei costruttori della classe derivata…
…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.
…mediante il costrutto super() che deve essere la prima istruzione eseguibile del corpo del costruttore della classe derivata.
![Page 24: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/24.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
EsempioEsempio
EsempioCostuttori1.javaEsempioCostuttori1.java
![Page 25: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/25.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Qualora un costruttore della classe derivata non contiene l’invocazione esplicita di un costruttore …
Qualora un costruttore della classe derivata non contiene l’invocazione esplicita di un costruttore …
…viene invocato automaticamente il costruttore senza parametri…
…viene invocato automaticamente il costruttore senza parametri…
…se quest’ultimo non è presente viene generato un errore.
…se quest’ultimo non è presente viene generato un errore.
![Page 26: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/26.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
EsempioEsempio
EsempioCostuttori2.javaEsempioCostuttori2.java
![Page 27: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/27.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Se una classe derivata non contiene costruttori …Se una classe derivata non contiene costruttori …
…Java ne fornisce automaticamente un costruttore standard senza parametri…
…Java ne fornisce automaticamente un costruttore standard senza parametri…
…che invoca il costruttore senza parametri della classe base...
…che invoca il costruttore senza parametri della classe base...
…e lascia i campi dati della classe derivata al loro valore di default.
…e lascia i campi dati della classe derivata al loro valore di default.
![Page 28: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/28.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
EsempioEsempio
EsempioCostuttori3.javaEsempioCostuttori3.java
![Page 29: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/29.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
Costrutto this()Costrutto this()
…da utilizzare in modo analogo a super()…
…da utilizzare in modo analogo a super()…
…è un’invocazione esplicita ad un altro costruttore della stessa classe…
…è un’invocazione esplicita ad un altro costruttore della stessa classe…
…permette si riusare codice già scritto…
…permette si riusare codice già scritto…
![Page 30: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/30.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
EsempioEsempio
PersonaThis.javaPersonaThis.java
![Page 31: Derivazione tra classi](https://reader033.vdocumenti.com/reader033/viewer/2022051001/56814aeb550346895db7f8e3/html5/thumbnails/31.jpg)
Laboratorio di programmazioneJava
Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”
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
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
Principi fondamentali della derivazionePrincipi fondamentali della derivazione