PDA

Visualizza la versione completa : [Java] polimorfismo e dynamic binding


Prazision
02-04-2005, 17:31
Dunque leggendo un capitolo sulle interfacce in Java ho trovato:
"Il collegamento tra l'invocazione di un metodo e la sua definizione , per
un riferimento polimorfico, può avvenire solo a tempo di esecuzione.
Infatti la definizione del metodo da usare dipende dall'oggetto puntato
nell'istante in cui viene eseguita l'invocazione del metodo."

allora mi chiedo:
date 2 classi Cane,Gatto e un'interfaccia Animale

Animale definice un metodo emetteVerso() poi implementato sia da Cane che
da Gatto
nel main di una terza classe Fattoria ho:

Animale anim;

anim=new Cane();
anim.emetteVerso();

anim=new Gatto();
anim.emetteVerso();

in questo caso Il collegamento tra l'invocazione di un metodo e la sua
definizione avviene a tempo di esecuzione(secondo quanto detto sopra)
ma perchè il collegamento non puo' avvenire a tempo di compilazione??
insomma il compilatore sa che prima anim è un riferimento ad un oggetto di
tipo Cane e dopo diventa un riferimento ad un oggetto di tipo Gatto e
quindi il collegamento potrebbe avvenire a tempo di compilazione.
poi mi chiedo: in un caso dove non ci sono riferimenti poliformici il
collegamento tra l'invocazione di un metodo e la sua definizione avviene a
tempo di compilazione??

scusate se ho detto un mucchio di boiate ma la cosa mi è poco chiara
grazie

dekdek
02-04-2005, 18:26
No: anim e' un riferimento a un oggetto di tipo Animale, che punta a un oggetto, prima di tipo Cane, poi di tipo Gatto. Ma il suo tipo rimane Animale.

Quello postato da te e' un esempio in cui il polimorfismo non viene sfruttato. Avresti potuto dichiarare una variabile di tipo Cane e una di tipo Gatto.

Scrivendo invece:



Animale[] anim = {new Cane(), new Gatto()};

for (i=0; i<anim.length; ++i)
anim[i].emetteVerso();


si capisce l'utilita' del binding dinamico.

Se il tuo dubbio era solo sul fatto che il compilatore non ottimizza il codice, ricordati che Java e' un linguaggio orientato al multitasking. Nessuno ti assicura che la sequenza:



anim=new Cane();
anim.emetteVerso();


non venga interrotta dall'esecuzione di un altro thread che vada a modificare anim.

alka
02-04-2005, 18:32
Originariamente inviato da Prazision
ma perchè il collegamento non puo' avvenire a tempo di compilazione??

Perchè la tua variabile appartiene al tipo che rappresenta la classe generica; per sapere quale metodo deve essere effettivamente richiamato, è necessario analizzare a runtime, al momento della chiamata, di quale oggetto discendente si tratta e qual è il codice effettivo da eseguire in base alla precedente condizione.

Data la semplicità del codice che hai riportato, è lecito che tu ti stia domandando perchè il collegamento al metodo non venga eseguito in fase di compilazione...ma tieni presente che non tutti i casi sono così semplici: potresti avere a che fare con una lista di oggetti Animale, magari astratta, magari inizializzata con classi discendenti prelevate casualmente...in sostanza, l'uso del late binding è una prerogativa (non solo in Java) e viene utilizzata in tutti i casi.


Originariamente inviato da Prazision
poi mi chiedo: in un caso dove non ci sono riferimenti poliformici il
collegamento tra l'invocazione di un metodo e la sua definizione avviene a
tempo di compilazione??
Se non ricordo male, in Java si utilizza la direttiva final per impedire che un metodo possa essere ridefinito; in tal caso, il riferimento al metodo è statico e l'invocazione avviene direttamente; in altri linguaggi, come C#, la ridefinizione è possibile solamente sui metodi virtual, cioè quei metodi per i quali viene consentito l'override, la ridefinizione.


Originariamente inviato da Prazision
scusate se ho detto un mucchio di boiate ma la cosa mi è poco chiara

Dubbi leciti. :)
Sicuramente qualcun altro aggiungerà altre considerazioni.

Ciao! :ciauz:

Prazision
02-04-2005, 19:56
domani guardo.grazie

MMarzia
03-04-2005, 11:42
linguaggio anche nel titolo..

Prazision
03-04-2005, 14:43
grazie a tutti. effettivamente l'esempio del libro era poco azzeccato

scusa MMarzia , l'avevo dimenticato

Loading