LEZIONE DI SILVANO NATALIZI DEL 23 NOVEMBRE 2008 PER LA CLASSE IVA LICEO TECNICO Ereditarietà e polimorfismo
Albero di ereditarietà per un programma di simulazione di animali
1 quali sono gli attributi e i comportamenti comuni? <ul><li>Ci è chiesto di disegnare un programma di simulazione che per...
Caratteristiche comuni <ul><li>Variabili d’istanza: </li></ul><ul><ul><li>Immagine </li></ul></ul><ul><ul><li>Cibo (carne,...
2) Disegnare una classe che rappresenti lo stato e il comportamento comune <ul><li>Disegniamo una super classe Animale </l...
3) Decidere se una classe necessita di comportamenti specifici <ul><li>Non tutti gli animali mangiano e parlano al medesim...
  4) cerchiamo altre opportunità di usare l’astrazione per trovare altri elementi comuni <ul><li>Guardiamo alle sottoclass...
5) Completiamo la gerarchia delle classi <ul><li>Decidiamo che la classe Canina ha in comune il metodo muoversi() e che an...
Quale metodo è chiamato ? <ul><li>La classe Volpe ha 4 metodi;  </li></ul><ul><ul><li>dormire() ereditato da Animale; </li...
Il più basso vince ! <ul><li>Volpe v=new Volpe(); </li></ul><ul><li>v.fareRumore(); </li></ul><ul><li>v.muoversi() </li></...
Il criterio is-a, has-a <ul><li>Quando una classe eredita da un’altra diciamo che extends la super classe. </li></ul><ul><...
Ma c’è di più ! <ul><li>Il criterio di test is-a lavora ovunque nell’albero di ereditarietà. </li></ul><ul><li>If class B ...
Di più di più <ul><li>Finchè Animale è da qualche parte nella gerarchia di ereditarietà al di sopra di Volpe,    la Volpe...
1) Evitare codice duplicato <ul><li>Metti il codice comune in un unico luogo, lascia che le sottoclassi ereditino il codic...
2) Definire un protocollo comune per un gruppo di classi <ul><li>La ereditarietà garantisce che tutte le classi, raggruppa...
Polimorfismo piccola introduzione <ul><li>Cane mioCane= new Cane(); </li></ul><ul><li>La precedente dichiarazione avviene ...
Polimorfismo 2 <ul><li>Il punto importante della questione è che il tipo della variabile di riferimento e il tipo dell’ogg...
Polimorfismo 3 <ul><li>Quando si dichiare una variabile di riferimento, ogni oggetto che supera il test is-a per il tipo d...
Esempio polimorfismo <ul><li>Animale[] animali=new Animale[5]; </li></ul><ul><ul><li>abbiamo dichiarato un array di animal...
Esempio polimorfismo <ul><li>Inoltre potete scorrere tutti gli elementi dell’array e richiamare i metodi della classe Anim...
<ul><li>Class Vet { </li></ul><ul><ul><li>public void visita(Animale a){ </li></ul></ul><ul><ul><ul><li>//  </li></ul></ul...
Upcoming SlideShare
Loading in …5
×

Ereditarietà E Polimorfismo

2,332 views

Published on

Ereditarietà e polimorfismo

1 Comment
0 Likes
Statistics
Notes
  • Be the first to like this

No Downloads
Views
Total views
2,332
On SlideShare
0
From Embeds
0
Number of Embeds
63
Actions
Shares
0
Downloads
51
Comments
1
Likes
0
Embeds 0
No embeds

No notes for slide

Ereditarietà E Polimorfismo

  1. 1. LEZIONE DI SILVANO NATALIZI DEL 23 NOVEMBRE 2008 PER LA CLASSE IVA LICEO TECNICO Ereditarietà e polimorfismo
  2. 2. Albero di ereditarietà per un programma di simulazione di animali
  3. 3. 1 quali sono gli attributi e i comportamenti comuni? <ul><li>Ci è chiesto di disegnare un programma di simulazione che permetta agli utenti di giocare con tanti animali differenti nel loro ambiente per vedere che cosa succede. </li></ul><ul><li>Vogliamo anche che altri programmatori possano aggiungere in ogni momento altri tipi di animali al programma </li></ul><ul><li>Che cosa hanno i sei tipi di animali, cane, gatto, volpe, ippopotamo, leone, tigre, in comune ? </li></ul><ul><li>Quale è la relazione tra questi sei tipi ? </li></ul><ul><li>Ogni animale sarà rappresentato da un oggetto </li></ul><ul><li>Questi oggetti si muoveranno in un ambiente, facendo tutto quello che è permesso dalla programmazione di ciascun tipo. </li></ul>
  4. 4. Caratteristiche comuni <ul><li>Variabili d’istanza: </li></ul><ul><ul><li>Immagine </li></ul></ul><ul><ul><li>Cibo (carne, erba) </li></ul></ul><ul><ul><li>Fame </li></ul></ul><ul><ul><li>Confini ambiente </li></ul></ul><ul><ul><li>Posizione (dell’animale) </li></ul></ul><ul><li>Metodi </li></ul><ul><ul><li>fareRumore() - il parlare degli animali </li></ul></ul><ul><ul><li>mangiare() </li></ul></ul><ul><ul><li>dormire() </li></ul></ul><ul><ul><li>muoversi() </li></ul></ul>
  5. 5. 2) Disegnare una classe che rappresenti lo stato e il comportamento comune <ul><li>Disegniamo una super classe Animale </li></ul><ul><li>Inseriamoci tutte le variabili e i metodi di cui tutti gli animali possano avere bisogno </li></ul>
  6. 6. 3) Decidere se una classe necessita di comportamenti specifici <ul><li>Non tutti gli animali mangiano e parlano al medesimo modo </li></ul><ul><li>Per cui decidiamo di (override) sovrascrivere i metodi mangiare() e fareRumore() nelle singole sottoclassi </li></ul>
  7. 7. 4) cerchiamo altre opportunità di usare l’astrazione per trovare altri elementi comuni <ul><li>Guardiamo alle sottoclassi e troviamo che la volpe e il cane hanno comportamenti comuni; lo stesso dicasi per il leone, la tigre e il gatto. I primi appartengono alla razza canina gli altri a quella felina </li></ul><ul><li>Possiamo usare le famiglie biologiche per organizzare le classi degli animali e in questo caso creiamo una classe Canina super classe di Volpe e Cane; e creiamo una classe Felina super classe di Gatto Tigre Leone </li></ul>
  8. 8. 5) Completiamo la gerarchia delle classi <ul><li>Decidiamo che la classe Canina ha in comune il metodo muoversi() e che anche la classe Felina ha in comune un proprio metodo muoversi(). </li></ul>
  9. 9. Quale metodo è chiamato ? <ul><li>La classe Volpe ha 4 metodi; </li></ul><ul><ul><li>dormire() ereditato da Animale; </li></ul></ul><ul><ul><li>muoversi() ereditato da Canina </li></ul></ul><ul><ul><li>fareRumore() e mangiare() sovrascritti </li></ul></ul><ul><li>Quando si crea un oggetto volpe e lo si assegna ad una variabile, si usa l’operatore punto . Per invocare l’esecuzione dei 4 metodi. Ma quale versione di questi metodi viene chiamata ? </li></ul>
  10. 10. Il più basso vince ! <ul><li>Volpe v=new Volpe(); </li></ul><ul><li>v.fareRumore(); </li></ul><ul><li>v.muoversi() </li></ul><ul><li>v.mangiare(); </li></ul><ul><li>v.dormire(); </li></ul>
  11. 11. Il criterio is-a, has-a <ul><li>Quando una classe eredita da un’altra diciamo che extends la super classe. </li></ul><ul><li>Quando vogliamo sapere se una cosa possa estenderne un’altra, applichiamo il criterio di test is-a ossia è un </li></ul><ul><li>Un triangolo è una forma </li></ul><ul><li>Un gatto è un felino </li></ul><ul><li>Un lavandino estende un gabinetto ? </li></ul><ul><li>Applichiamo il test is-a, un lavandino è un bagno ? Decisamente NO! </li></ul><ul><li>Rovesciamo il test, un bagno è un lavandino ? NO! </li></ul><ul><li>Bagno e lavandino sono correlati, ma dalla relazione has-a, ossia un bagno ha un lavandino </li></ul><ul><li>Ciò significa che Bagno ha una variabile di tipo Lavandino, ossia un riferimento a Lavandino, ma non lo estende e viceversa. </li></ul>
  12. 12. Ma c’è di più ! <ul><li>Il criterio di test is-a lavora ovunque nell’albero di ereditarietà. </li></ul><ul><li>If class B extends class A, class B is-a class A </li></ul><ul><li>If class C extends class B, class C supera il test is-a sia per la classe B che per quella A. </li></ul><ul><li>Canina extends Animale </li></ul><ul><ul><li>Volpe extends Canina </li></ul></ul><ul><ul><ul><li>Volpe extends Animale </li></ul></ul></ul><ul><li>Canina è un Animale </li></ul><ul><li>Volpe is-a Canina </li></ul><ul><ul><ul><li>Volpe is-a Animale </li></ul></ul></ul>
  13. 13. Di più di più <ul><li>Finchè Animale è da qualche parte nella gerarchia di ereditarietà al di sopra di Volpe,  la Volpe è un Animale sarà sempre vero ! </li></ul><ul><li>Questa struttura di ereditarietà dice al mondo: </li></ul><ul><ul><li>“ la Volpe è una Canina, pertanto può fare tutto quello che un Canino fa. </li></ul></ul><ul><ul><li>“ la Volpe è un Animale, pertanto può fare tutto quello che un’animale fa. </li></ul></ul><ul><li>Non fa differenza se la Volpe ridefinisce alcuni metodi di Animale o Canina </li></ul><ul><li>Per il mondo esterno al nostro codice, una Volpe può eseguire i quattro metodi; non importa come lo faccia o dove. </li></ul>
  14. 14. 1) Evitare codice duplicato <ul><li>Metti il codice comune in un unico luogo, lascia che le sottoclassi ereditino il codice della super classe. </li></ul><ul><li>Quando vuoi cambiare questo codice lo devi modificare in un solo posto e tutti gli altri vedranno la variazione </li></ul><ul><li>Magicamente quella variazione si riflette in tutte le classi che ereditano quel comportamento </li></ul><ul><li>Devi solo ricompilare la super classe </li></ul><ul><li>Non devi assolutamente ricompilare o comunque toccare le sottoclassi ! </li></ul>
  15. 15. 2) Definire un protocollo comune per un gruppo di classi <ul><li>La ereditarietà garantisce che tutte le classi, raggruppate sotto un determinato supertipo, abbiano tutti i suoi metodi. </li></ul><ul><ul><li>Quando definisci un metodo in una super classe, che può essere ereditato da tutte le sue sottoclassi, stai annunciando un tipo di protocollo “tutti i miei sottotipi possono fare queste cose, con questi metodi che assomigliano a questo…” </li></ul></ul><ul><ul><li>In altre parole si stabilisce un contratto </li></ul></ul><ul><ul><li>Un protocollo o contratto è un insieme di regole che ci si accorda di seguire e rispettare. </li></ul></ul>
  16. 16. Polimorfismo piccola introduzione <ul><li>Cane mioCane= new Cane(); </li></ul><ul><li>La precedente dichiarazione avviene in tre tempi: </li></ul><ul><li>1) Cane mioCane dice a java di allocare spazio in memoria per una variabile di riferimento di tipo Cane. In altre parole crea un telecomando che ha dei bottoni per controllare un Cane, non un Gatto o altro </li></ul><ul><li>2) new Cane() dice a java di allocare dello spazio in memoria per un nuovo oggetto Cane </li></ul><ul><li>3) = assegna il nuovo oggetto Cane alla variabile di riferimento mioCane; in altre parole programma il telecomando per selezionare il canale Cane. </li></ul>
  17. 17. Polimorfismo 2 <ul><li>Il punto importante della questione è che il tipo della variabile di riferimento e il tipo dell’oggetto creato siano i medesimi ! </li></ul><ul><li>In questo esempio entrambi sono di tipo Cane </li></ul><ul><li>Ma con il polimorfismo </li></ul><ul><ul><li>Il riferimento e l’oggetto possono essere di diversi tipo </li></ul></ul><ul><ul><li>Animale mioCane=new Cane(); </li></ul></ul><ul><li>Il tipo del riferimento può essere il tipo di una super classe dell’oggetto creato </li></ul>
  18. 18. Polimorfismo 3 <ul><li>Quando si dichiare una variabile di riferimento, ogni oggetto che supera il test is-a per il tipo dichiarato, può essere assegnato a quel riferimento. </li></ul><ul><li>In altre parole, ogni cosa che estende il tipo di variabile dichiarata può essere ad essa assegnata. </li></ul>
  19. 19. Esempio polimorfismo <ul><li>Animale[] animali=new Animale[5]; </li></ul><ul><ul><li>abbiamo dichiarato un array di animali che può quindi memorizzare oggetti di tipo Animale </li></ul></ul><ul><ul><li>Ma guarda cosa possiamo fare: </li></ul></ul><ul><li>animali[0]=new Cane(); </li></ul><ul><li>animali[1]=new Gatto(); </li></ul><ul><li>animali[2]=new Volpe(); </li></ul><ul><li>animali[3]=new Ippopotamo(); </li></ul><ul><li>animali[4]=new Leone(); </li></ul><ul><ul><li>Possiamo mettere un qualsiasi oggetto delle sottoclassi nell’array animali ! </li></ul></ul>
  20. 20. Esempio polimorfismo <ul><li>Inoltre potete scorrere tutti gli elementi dell’array e richiamare i metodi della classe Animale ed ogni oggetto fa la cosa che deve fare ! </li></ul><ul><li>For (int i=0; i<animali.lenght;i++){ </li></ul><ul><ul><li>animali[i].mangiare(); </li></ul></ul><ul><ul><li>animali[i].muoversi(); </li></ul></ul><ul><li>} </li></ul>
  21. 21. <ul><li>Class Vet { </li></ul><ul><ul><li>public void visita(Animale a){ </li></ul></ul><ul><ul><ul><li>// </li></ul></ul></ul><ul><ul><ul><li>a.fareRumore(); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul><ul><li>Il parametro a Animale può assumere qualsiasi tipo di animale come argomento e quando il veterinario dice ad un animale di fareRumore(), sarà eseguito il metodo del tipo di animale sotto cura! </li></ul><ul><li>Class AnimaleOwner{ </li></ul><ul><ul><li>Public void start(){ </li></ul></ul><ul><ul><ul><li>Vet ve=new Vet(); </li></ul></ul></ul><ul><ul><ul><li>Cane ca=new Cane(); </li></ul></ul></ul><ul><ul><ul><li>Leone le=new Leone(); </li></ul></ul></ul><ul><ul><ul><li>ve.visita(ca); </li></ul></ul></ul><ul><ul><ul><li>ve.visita(le); </li></ul></ul></ul><ul><ul><li>} </li></ul></ul><ul><li>} </li></ul>Esempio polimorfismo

×