Newsgroup: it.comp.java
Titolo: upcasting e riferimenti polimorfici

Dunque ammettiamo che abbia una Classe astratta Padre e alcune classi
figlie FigliaA, FigliaB ecc.
io scrivo
Padre pad=null;//riferimento polimorfico di tipo Padre che non punta a
nulla
FigliaA figlia1=new FigliaA()//riferimento di tipo FigliaA che punta
all'oggetto figlia1
pad = figlia1; //(upcasting:in questo caso il riferimento di tipo FigliaA
viene convertito in un riferimento di tipo Padre, almeno così ho capito)
a questo punto mi chiedo:
pad ora è un riferimento di tipo padre che punta ad un oggetto di tipo
FigliaA mentre figlia1 è un riferimento di tipo FigliaA che punta ad un
oggetto di tipo FigliaA ?
insomma non riesco a spiegarmi bene come mai se (dopo il codice scritto
sopra)scrivo:
pad.metodo1();//dove metodo1 è un metodo definito nella classe Padre e
ridefinito in maniera differente nella classe FigliaA
viene eseguito il metodo come è definito nella classe FigliaA (e uno dice:
è ovvio, punta ad un oggetto di tipo FigliaA)
poi scrivo
pad.metodo2();//dove metodo2 è un metodo definito solo nella classe FigliaA
non posso compilare la classe perchè mi da errore (perchè errore? pad non
punta ad un oggetto di tipo FigliaA che quel metodo lo possiede???)
poi scrivo
figlia1.metodo2();
ecco in questo caso me lo fa eseguire; perchè??non dovrebbero puntare allo
stesso oggetto padre e figlia1???il riferimento di tipo FigliaA non è
stato convertito in un riferimento di tipo Padre(tramite upcasting)???
Insomma mi sembrano tutti comportamenti in contrasto tra loro.
qualcuno mi spiega in maniera semplice cosa succede quando scrivo:
Padre pad=null;
FigliaA figlia1=new FigliaA();
pad = figlia1;
e il perchè dei comportamenti da me descritti
grazie
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

forse i comportamenti sono dovuti al fatto che pur puntando allo stesso
oggetto i 2 riferimenti sono di tipo diverso??
ma allora perchè si dice(almeno così ho letto) che tramite l'upcasting il
riferimento di tipo FigliaA viene convertito in un riferimento di tipo
Padre


 pad = figlia1;
assegni l'oggetto della sottoclasse ad una variabile di tipo superclasse.
La variabile pad rimane di tipo Padre, quindi puoi chiamare solo i 
metodi di tipo Padre.

ma quindi ho ragione quando dico:
"
forse i comportamenti sono dovuti al fatto che pur puntando allo stesso
oggetto i 2 riferimenti sono di tipo diverso??
"???
rimane il fatto che ho letto sul manuale che scrivendo 
pad = figlia1; 
il riferimento di tipo FigliaA viene convertito in un riferimento di tipo
Padre
a giudicare da quello che accade mi sembra che  il riferimento di tipo
FigliaA rimane tale nel senso che figlia1 continua a essere un riferimento
di tipo FigliaA
sai spiegarmi come interpretare ciň che ho letto sul manuale(sempre che
sia giusto?


 stato convertito in un riferimento di tipo Padre(tramite upcasting)???
Non č stata fatta nessuna conversione, l'istanza resta sempre del tipo 
che č stata creata anche dopo il casting. E' il punto focale del 
polimorfismo: il padre assume le "sembianze" del figlio.

cito da Thinking In Java in un caso analogo al mio:...L'azione di
convertire un riferimento Wind in un riferimento Instrument viene chiamata
Upcasting...
perchè dice che il riferimento della classe figlia vierne convertito in un
riferimento della classe padre?


forse ho fatto confusione io sul significato di convertire.
si usa il termine convertire anche quando si scrive
float a =1;
int b=8;
b=(int)a; 
il valore di a è convertito in int ma a rimane di tipo float e così 
nell'esempio di prima 
pad = figlia1; 
il riferimento di tipo FigliaA viene convertito in un riferimento di tipo
Padre nel senso che per potere assegnare a pad quell'oggetto è necessario
che l'oggetto di tipo FigliaA venga convertito in un riferimento di tipo
Padre ma comunque figlia1 continua a rimanere un riferimento di tipo
FigliaA 
spero di non avere detto boiate


 "???
si, se "riferimento" significa "variabile".
<snip>
 > sai spiegarmi come interpretare ciň che ho letto sul manuale(sempre che
 > sia giusto?
 >
non so cosa significa riferimento, sinceramente, č una mia limitazione.
Cerca di "mappare" la parola riferimento su uno dei due termini 
"variabile" o "oggetto" e poi si vede :)

 riferimento della classe padre?
Ovviamente perchè è così.
Il riferimento (reference, in inglese) è l'equivalente del puntatore in 
C/C++, semplificando molto il concetto. Tutti gli oggetti java non 
primitivi sono tracciati tramite reference, in buona sostanza sono dei 
reference le variabili che conterranno oggetti java.
Quando fai un upcasting semplicemente trasferisci un oggetto da un 
reference di un tipo ad uno di un'altro tipo, più in alto nella 
gerarchia delle classi. Vi è quindi una conversione dei reference, 
mentre l'oggetto rimane ovviamente del tipo che è stato creato (per 
controprova, basta mostrare a video il risultato digetClass().getName()).
La regola fondamentale è che l'istanza dell'oggetto è di un determinato 
tipo (quello stabilito con new, per intendersi) e può essere assegnato 
solo e soltanto a reference di uguale tipo o superclass. L'upcasting 
onora certamente questa regola per cui viene fatto implicitamente, 
mentre il downcasting "potrebbe" non onorare la regola per cui deve 
essere fatto esplicitamente.

beh probabilmente con riferimento intendevo quello che tu chiami variabile
gabriele renzi ha scritto:






 diana_est wrote:




