La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Derivazione tra classi.

Presentazioni simili


Presentazione sul tema: "Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Derivazione tra classi."— Transcript della presentazione:

1 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Derivazione tra classi

2 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza class B { //CLASSE BASE int x; void G() { x = x * 20; } } Classe D derivata da B class D extends B { //CLASSE DERIVATA void H() { x = x * 10; } }

3 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Tutte le proprietà definite per la classe base vengono implicitamente definite anche nella classe derivata … Principi fondamentali della derivazione – Principio 1

4 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza … cioè vengono ereditate da questultima. Ad esempio la classe D ha il campo dati int x; e la funzione void G(); Principi fondamentali della derivazione – Principio 1

5 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Ad esempio la classe D ha in più, rispetto alla classe base B, la funzione void H(); La classe derivata può avere ulteriori proprietà … Principi fondamentali della derivazione – Principio 2

6 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università 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 Principi fondamentali della derivazione – Principio 3 Ogni oggetto della classe derivata è anche un oggetto della classe base …

7 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza … la classe D è compatibile con la classe B. Principi fondamentali della derivazione – Principio 3 static void stampa(B bb) { System.out.println(bb.x); } … D d = new D(); d.G(); //OK stampa(d); //OK static void stampa(B bb) { System.out.println(bb.x); } … D d = new D(); d.G(); //OK stampa(d); //OK

8 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Non è vero che un oggetto della classe base è anche un oggetto della classe derivata … Principi fondamentali della derivazione – Principio 4 … non è possibile usare un oggetto della classe base laddove si può usare un oggetto della classe derivata.

9 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza B b = new B(); b.H(); //NO: non ha il campo H() D d = b; //NO: B non è compatibile con D b = new D(); //OK D è compatibile con B Principi fondamentali della derivazione – Principio 4

10 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Una classe derivata può fungere da classe base per ulteriori derivazioni … Gerarchie di classi: class B {…} class D extends B {…} class E extends D {…} in profondità

11 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Una classe può avere un numero qualsiasi di classi derivate … Gerarchie di classi: in ampiezza class B {…} class D extends B {…} class Dbis extends B {…}

12 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Gerarchie di classi: esempio C C D D Dbis E E Ogni classe ha solo una classe base… …no ereditarietà multipla in Java

13 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Casting

14 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università 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 Riferimenti di diverse classi possono denotare lo stesso oggetto

15 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università 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 Casting per accedere ai campi della classe derivata

16 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza … sempre sintatticamente corretto (non vengono mai rivelati errori di compilazione) … Il casting tra classi lungo lo stesso cammino in una gerarchia di derivazione è … … ma è responsabilità del programmatore che sia anche semanticamente corretto …

17 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università 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 nelloggetto //denotato da d! Esempio

18 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Livello di accesso protected

19 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza 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 … … non coincide con B.

20 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza …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 …garantendo laccesso ad essi alle classi derivate, ma bloccandone laccesso ai clienti generici.

21 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Costruttori delle classi derivate

22 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza 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 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza …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.

24 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Esempio EsempioCostuttori1.java

25 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Qualora 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.

26 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Esempio EsempioCostuttori2.java

27 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Se 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.

28 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Esempio EsempioCostuttori3.java

29 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Costrutto this() …da utilizzare in modo analogo a super() … …è uninvocazione esplicita ad un altro costruttore della stessa classe… …permette si riusare codice già scritto…

30 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Esempio PersonaThis.java

31 Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università 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 derivazione


Scaricare ppt "Laboratorio di programmazione Java Prof. Giuseppe De Giacomo Università di Roma La Sapienza Derivazione tra classi."

Presentazioni simili


Annunci Google