Derivazione tra classi

31
Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma “La Sapienza” 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 Presentation

Transcript of Derivazione tra classi

Page 1: Derivazione  tra classi

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Derivazione tra classi

Derivazione tra classi

Page 2: Derivazione  tra classi

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

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

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

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

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

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

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

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

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

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

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

CastingCasting

Page 14: Derivazione  tra classi

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

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

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

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Livello di accesso protected

Livello di accesso protected

Page 19: Derivazione  tra classi

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

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

Costruttori delle classi derivate

Costruttori delle classi derivate

Page 22: Derivazione  tra classi

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

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

EsempioEsempio

EsempioCostuttori1.javaEsempioCostuttori1.java

Page 25: Derivazione  tra classi

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

EsempioEsempio

EsempioCostuttori2.javaEsempioCostuttori2.java

Page 27: Derivazione  tra classi

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

EsempioEsempio

EsempioCostuttori3.javaEsempioCostuttori3.java

Page 29: Derivazione  tra classi

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

Laboratorio di programmazioneJava

Prof. Giuseppe De GiacomoUniversità di Roma “La Sapienza”

EsempioEsempio

PersonaThis.javaPersonaThis.java

Page 31: Derivazione  tra classi

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