View Single Post
Old 18-11-2003, 15:23   #34
PGI
Bannato
 
L'Avatar di PGI
 
Iscritto dal: Nov 2001
Città: Verona
Messaggi: 1086
Quote:
Originariamente inviato da misterx
se desidero accedere ai metodi di una sottoclasse avendo definento come riferimento una variabile della superclasse è sufficiente che utilizzi il (cast) operator

Codice:
Negozio n;
System.out.println( ((Pizzeria)n).Insegna() );
Che fai, modifichi mentre rispondo?

L'esempio traballa un po'. Le due righe di codice sono errate come "codice reale", ma mi sembra di capire che sia una sintesi del concetto.

Secondo il rapporto tra classi padre e figlio, il tipo figlio è anche tipo padre ma il padre non è "compatibile" con il figlio: in soldoni,
Pizzeria è anche un tipo Negoziante, ma Negoziante non è un tipo Pizzeria.

Se crei un riferimento di tipo Negozio "n" ad un oggetto Negozio e poi cerchi di fare un casting a Pizzeria ottieni un errore di tipo ClassCastException (eccezione nella conversione della classe) durante l'esecuzione, perchè l'oggetto puntato dal riferimento "n" (cioè quello che c'è in memoria) non è compatibile con il modello Pizzeria.

Creando invece un riferimento di tipo "Negozio" "n" ad un oggetto di tipo "Pizzeria" il casting di "n" a "Pizzeria" è valido in compilazione perchè il tipo pizzeria è compatibile (in quanto sottotipo) con Negozio, ed è valido in esecuzione perchè la locazione di memoria a cui punta il riferimento "n" contiene un oggetto Pizzeria.

Detta così sembra che non serva a niente , ma ha una sua utilità. Quando poi comincerai a mischiare oggetti padre e figli con interfacce padre e figlie la faccenda diventerà ancora più ingarbugliata, ma le regole che la gestiscono sono quelle due o tre di cui abbiamo parlato finora.
PGI è offline   Rispondi citando il messaggio o parte di esso