G. Mecca – Università della Basilicata – [email protected]Programmazione Orientata agli Oggetti in Linguaggio Java Ereditarietà e Polimorfismo: Polimorfismo - c Eredità del Tipo e Binding versione 1.2 Questo lavoro è concesso in uso secondo i termini di una licenza Creative Commons (vedi ultima pagina) 2 G. Mecca - Programmazione Orientata agli Oggetti Sommario m Il Problema m Cast Applicato a Riferimenti m Ereditarietà del Tipo m Algoritmo di Esecuzione Binding Statico Binding Dinamico Ereditarietà e Polimorfismo: Polimorfismo >> Sommario
21
Embed
Programmazione Orientata agli Oggetti in Linguaggio Javadb.unibas.it/users/mecca/corsi/2004-2005/progOggettiII/materiale/... · agli Oggetti in Linguaggio Java Ereditarietà e Polimorfismo:
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Ereditarietà e Polimorfismo: Polimorfismo >> Il Problema
gli oggetti prelevati dalla lista sono trattati come oggetti
di tipo “Impegno”indifferentemente dalle
differenze di tipo
a ciascun oggetto viene chiesto di eseguire il metodo
toString() nel modo più appropriato per il tipo di impegno
L’output atteso:- riunione con Marco- lezione di Prog. Oggetti- riunione della CIP
26/01/2005
3
5G. Mecca - Programmazione Orientata agli Oggetti
Il Problema
m Un passo avanti nella soluzioneðsappiamo che è possibile definire Impegno come
nuovo tipo (tipo = interfaccia)
m Intuitivamenteðvengono prelevati dalla lista riferimenti ai vari
impegni (riferimenti di tipo Object)ðviene effettuato il cast di ciascun impegno sul tipo
comune definito dall’interfaccia Impegnoðciascun tipo di impegno esegue opportunamente il
metodo toString()
Ereditarietà e Polimorfismo: Polimorfismo >> Il Problema
6G. Mecca - Programmazione Orientata agli Oggetti
Il Problema
m In dettaglio, peròðci sono due questioni non completamente
chiare
mQuestione n. 1ðqual è la semantica del cast ?
mQuestione n. 2ðqual è l’algoritmo secondo cui viene eseguito
il metodo toString() ?
Ereditarietà e Polimorfismo: Polimorfismo >> Il Problema
26/01/2005
4
7G. Mecca - Programmazione Orientata agli Oggetti
Cast Applicato a Riferimenti
m L’operatore di castðoperatore che cambia il tipo di un valoreðsemantica nota nel caso dei tipi di base
mCast applicato ad un riferimentoðil cast in realtà coinvolge l’oggettoðintuitivamente sto chiedendo all’oggetto
relativo di “cambiare tipo”
mQuanti tipi ha un oggetto ?
Ereditarietà e Polimorfismo: Polimorfismo >> Cast Applicato a Riferimenti
8G. Mecca - Programmazione Orientata agli Oggetti
Cast Applicato a Riferimenti
mUn esempioðconsideriamo una riunione:
Riunione r = new Riunione();ðil cui riferimento viene inserito nella lista:
lista.add((Object)r); // il cast è implicitoðsuccessivamente viene recuperato:
Object o = lista.get(i);ðe trattato come oggetto di tipo Impegno
Impegno impegno = (Impegno)o;
Ereditarietà e Polimorfismo: Polimorfismo >> Cast Applicato a Riferimenti
26/01/2005
5
9G. Mecca - Programmazione Orientata agli Oggetti
Cast Applicato a Riferimenti
mDurante queste operazioniðvengono effettuati ripetute operazioni di castðda Riunione a Objectðda Object a Impegno
m Il senso di queste operazioniðmanipolare l’oggetto con riferimenti di tipo
diverso (r, o, impegno)ðognuno dei quali richiede un oggetto del tipo
opportuno
Ereditarietà e Polimorfismo: Polimorfismo >> Cast Applicato a Riferimenti
10G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
m In effettiði riferimenti sono strettamente tipatiðma all’interno della gerarchia c’è un
fenomeno di “ereditarietà del tipo”ðper cui un oggetto può assumere “tipi diversi”
e quindi essere compatibile con rif. diversim La semantica dell’ereditarietà di tipoðanche in questo caso è spiegabile sulla base
dell’associazione gerarchica di oggetti
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
6
11G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
m In particolareðciascun oggetto della gerarchia è compatibile
con uno o più tipiðcollaborando, l’associazione può “assumere”
ciascuno di questi tipiðe quindi proporsi come un “superoggetto”
compatibile con riferimenti diversi
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
12G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mPer cominciareðalcune regole elementari sul tipo di un
oggettom I tipi per gli oggettiðogni oggetto ha il tipo della propria classe
(ne ha l’interfaccia)ðse una classe implementa un’interfaccia, gli
oggetti di quella classe hanno il tipo definito dall’interfaccia (interface)
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
7
13G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
Riunione
ImpegnoAstratto
Object
getDescrizione()getPartecipanti()
superdescrizionepartecipanti
12345 : Riunione
764
: Principale
getLuogo()getOrario()
superluogoorarionote
764 : ImpegnoAstratto
4921
equals()toString()
4921 : Object
Riunione r = new Riunione();
tipo: Object
tipo: ImpegnoAstratto+ Impegno
tipo: Riunione
<<interface>>Impegno
r #12345#102
14G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mComportamento polimorfoðl’associazione è in grado di presentarsi con
“facce diverse”, ovvero con tipi diversiðovvero in modo “polimorfo” (molte forme)ðquesto avviene esponendo, un “oggetto di
turno” diverso a seconda del tipo richiestomOggetto di turnoðoggetto incaricato di ricevere i messaggi da
parte di un certo riferimento
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
ATTENZIONEall’intuizione dietro
il polimorfismo
26/01/2005
8
15G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mATTENZIONEðci sono quindi due oggetti importanti nella
gerarchiam L’oggetto puntatoðquello il cui OID è mantenuto nel riferimento
(l’oggetto la cui creazione ha dato luogo all’associazione)
m L’oggetto di turnoðl’oggetto del tipo richiesto per il riferimento
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
16G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mSemantica del castðil cast si applica ad un oggetto (attraverso un
riferimento) per renderlo compatibile con un riferimento di tipo diversoðproduce un cambio di turno nell’associazione
gerarchica; l’oggetto di turno diventa quello del tipo compatibile con il tipo richiestoðda quel momento, l’oggetto di turno intercetta
le chiamate inviate attraverso il nuovo riferimento
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
9
17G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
Riunione
ImpegnoAstratto
Object
getDescrizione()getPartecipanti()
superdescrizionepartecipanti
12345 : Riunione
764
: Principale
getLuogo()getOrario()
superluogoorarionote
764 : ImpegnoAstratto
4921
equals()toString()
4921 : Object
Riunione r = new Riunione();
tipo: Object
tipo: ImpegnoAstratto+ Impegno
tipo: Riunione
<<interface>>Impegno
Object o = (Object) r;Impegno i = (Impegno) o;ImpegnoAstratto ia =
(ImpegnoAstratto) i;
r #12345#102
o #12345#103
i #12345#104
18G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mMetaforaðl’oggetto di turno per un riferimento è
incaricato di fare la guardiaðsorveglia ed intercetta gli eventuali messaggi
inviati verso l’associazione da parte del riferimentoðcambiando la guardia, l’associazione
“inganna” i riferimenti proponendosi di volta in volta con “facce” diverse
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
10
19G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
m In questo modoðviene rispettato il tipo del riferimentoðciascun riferimento “vede” un oggetto di
turno diverso, il cui tipo (interfaccia) coincide con quello previsto
mDall’esternoðè possibile dire che l’oggetto originale di tipo
Riunione è in grado di cambiare il suo tipo
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
20G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mRadiografia dei cambi di turnoðpasso 1: creo un oggetto di tipo Riunione
Riunione r = new Riunione(); // OID #12345l’oggetto di turno per r è di tipo Riunione (coincide con l’oggetto puntato)ðpasso 2: lo aggiungo alla lista degli impegni
lista.add(r);viene fatto un cast automatico a Object; l’oggetto di turno per il riferimento nella lista è di tipo Object; l’oggetto puntato resta 12345
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
11
21G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mRadiografia dei cambi di turno (continua)ðpasso 3: lo estraggo dalla lista
Object o = lista.get(i);l’oggetto puntato è #12345; l’oggetto di turno per o è Objectðil riferimento subisce un cast a Impegno;
Impegno i = (Impegno)o;l’oggetto di turno per i è di tipo ImpegnoAstratto; l’oggetto puntato resta #12345
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
22G. Mecca - Programmazione Orientata agli Oggetti
Ereditarietà del Tipo
mMeccanicamenteðpossiamo riassumere il fenomeno dicendo
che ciascun oggetto di una gerarchia “eredita” tutti i tipi dei suoi superoggettiðed è quindi possibile applicare all’oggetto il
cast su qualunque di questi tipiðquesto consente di manipolare l’oggetto
attraverso riferimenti di tipi diversi
Ereditarietà e Polimorfismo: Polimorfismo >> Ereditarietà del Tipo
26/01/2005
12
23G. Mecca - Programmazione Orientata agli Oggetti
Algoritmo di Esecuzione
mA questo puntoðresta da risolvere solo il secondo problema
mOvveroðdescrivere in dettaglio la semantica della
chiamata al metodo toString()ðin particolare, ci interessa la chiamata:
Ereditarietà e Polimorfismo: Polimorfismo >> Algoritmo di Esecuzione
In questo caso:- gli animali che sono Volpi agiscono andando a caccia- gli animali che sono Conigli agiscono correndo
38G. Mecca - Programmazione Orientata agli Oggetti
Binding Dinamico
Ereditarietà e Polimorfismo: Polimorfismo >> Algoritmo di Esecuzione
Volpe
Object
: Principale
void agisci()String toString()
superfame
764 : Volpe
4921
equals()toString()
4921 : Object
Object o = scacchiera.elemento(i, j);
<<interface>>Animale
o #764#102
animale.agisci();
la chiamata viene eseguitadall’oggetto puntato(Volpe o Coniglio)
animale #764#103
Animale animale = (Animale)o;
tipo: Object
tipo: Volpe+ Animale
Binding DinamicoVolpe
Object
: Principale
void agisci()String toString()
superfame
764 : Volpe
4921
equals()toString()
4921 : Object
<<interface>>Animale
26/01/2005
20
39G. Mecca - Programmazione Orientata agli Oggetti
Binding Dinamico
mAttenzioneðil binding dinamico ha dei costi in termini di
esecuzionem Infatti, nel caso di binding staticoðsulla base del tipo del riferimento il
compilatore può decidere staticamente quale versione del metodo verrà eseguita e fare le ottimizzazioni del casoðnon è necessario attendere l’esecuzione
Ereditarietà e Polimorfismo: Polimorfismo >> Algoritmo di Esecuzione
40G. Mecca - Programmazione Orientata agli Oggetti
Binding Dinamico
mNel caso del binding dinamico, viceversaðla versione del metodo non dipende dal tipo
del riferimento, ma dell’associazione di oggetti lungo la gerarchiaðviene decisa solo a tempo di esecuzione e
richiede l’intervento della macchina virtualem Infattiðil binding dinamico si chiama anche “late
binding”
Ereditarietà e Polimorfismo: Polimorfismo >> Algoritmo di Esecuzione
26/01/2005
21
41G. Mecca - Programmazione Orientata agli Oggetti
Riassumendo
m Il ProblemamCast Applicato a RiferimentimEreditarietà del TipomAlgoritmo di Esecuzione (“Binding”)ðBinding StaticoðBinding Dinamico
Ereditarietà e Polimorfismo: Polimorfismo >> Sommario
42G. Mecca - Programmazione Orientata agli Oggetti
Termini della Licenza
Termini della Licenza
m This work is licensed under the Creative Commons Attribution-ShareAlike License. To view a copy of this license, visit http://creativecommons.org/licenses/by-sa/1.0/ or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.
m Questo lavoro viene concesso in uso secondo i termini dellalicenza “Attribution-ShareAlike” di Creative Commons. Per ottenereuna copia della licenza, è possibile visitarehttp://creativecommons.org/licenses/by-sa/1.0/ oppure inviare unalettera all’indirizzo Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.