View Full Version : [JAVA] Casting su oggetti oggetti (esercizio)
considerate questa situazione
B & C sono sottoclassi estensioni di A
D è sottoclasse estensione di C
assumiamo gli assegnamenti
A a1,a2,a3,a4;
B b;
C c1,c2;
D d;
a1 = new A(); a2 = new B(); a3 = new C(); a4 = new D();
b = new B();
c1 = new C(); c2 = new D();
d = new D()
per ciascuno degli assegnamenti devo dire se è consentito, se è consentito ma richiede un cast esplicito, se da errore di compilazione o se da errore in esecuzione
b=a2
b=a1
a1=c1
a2=b
a4=c1
a1=c1
c2=c1
c1=(C)a2
c1=a3
non riesco a trovare la logica del funzionamento
mettiamola facile:
A classe animale
B classe pesce
C classe mammifero
D classe mucca
b=a2: pesce(new pesce) = animale (new pesce)
necessita di un cast b=(B)a2 ? cioè pesce(new pesce) =(Pesce) animale (new pesce)
non ci capisco più nulla :doh:
considerate questa situazione
B & C sono sottoclassi estensioni di A
D è sottoclasse estensione di C
assumiamo gli assegnamenti
A a1,a2,a3,a4;
B b;
C c1,c2;
D d;
a1 = new A(); a2 = new B(); a3 = new C(); a4 = new D();
b = new B();
c1 = new C(); c2 = new D();
d = new D()
per ciascuno degli assegnamenti devo dire se è consentito, se è consentito ma richiede un cast esplicito, se da errore di compilazione o se da errore in esecuzione
b=a2
b=a1
a1=c1
a2=b
a4=c1
a1=c1
c2=c1
c1=(C)a2
c1=a3Per le variabili di tipo "reference" la questione della assegnazione è molto semplice: dato ad esempio X x1; puoi assegnare a x1 una qualunque variabile di tipo X o di una sottoclasse di X.
Veniamo al tuo esercizio, prendo come esempio solo 2 delle assegnazioni che hai scritto:
b=a2
b è una variabile di tipo B, a2 è una variabile di tipo A. Ti devi chiedere: A è una sottoclasse di B?? No, è una super-classe, quindi l'assegnazione non è valida. Non ha importanza il fatto che a2 contenga un riferimento ad un oggetto di tipo B.
a1=c1
a1 è una variabile di tipo A, c1 è una variabile di tipo C. Ti devi chiedere: C è una sottoclasse di A?? Sì, quindi l'assegnazione è ok.
grazie della risposta
forse ho capito il trucco
rimane un dubbio
c2=c1 compila
c1=c2 compila uguale? :confused:
:mc:
La cosa è molto logica, una classe ha dei metodi, e te devi essere in gradi di eseguirli, quindi non puoi eseguire, ne cercare di eseguire metodi che una classe non ha.
Ad esempio hai la classe Cane sottoclasse della classe Animale:
la classe animale ha il meotodo muoviti, la classe cane aggiunge il meotodo abbaia.
Quindi avrai che qualunque oggetto di tipo cane può sia muoversi che abbaiare, ma un oggetto di tipo animale può solo spostarsi.
Cioè signfica che non puoi usare la classe animale come se fosse un cane, mentre è vero il contrario, quindi:
Cane cane=new Cane();
Animale animale=new Animale();
cane=animale NO (perchè poi vorresti fare cane.abbaia che xò non puoi perchè abbaia non fa parte di animale)
animale=cane SI (perchè se vuoi puoi fare animale.abbaia e ovviamente anche animale.muoviti)
rimane un dubbio
c2=c1 compila
c1=c2 compila uguale? :confused: Certo, perché sono entrambe (c1 e c2) di tipo C, quindi compatibili.
La cosa è molto logica, una classe ha dei metodi, e te devi essere in gradi di eseguirli, quindi non puoi eseguire, ne cercare di eseguire metodi che una classe non ha.
Ad esempio hai la classe Cane sottoclasse della classe Animale:
la classe animale ha il meotodo muoviti, la classe cane aggiunge il meotodo abbaia.
Quindi avrai che qualunque oggetto di tipo cane può sia muoversi che abbaiare, ma un oggetto di tipo animale può solo spostarsi.
Cioè signfica che non puoi usare la classe animale come se fosse un cane, mentre è vero il contrario, quindi:
Cane cane=new Cane();
Animale animale=new Animale();
cane=animale NO (perchè poi vorresti fare cane.abbaia che xò non puoi perchè abbaia non fa parte di animale)
animale=cane SI (perchè se vuoi puoi fare animale.abbaia e ovviamente anche animale.muoviti)
non mi torna in che gerarchia sta
Animale x1 = new Cane()
Animale X2 = new Animale()
x2 = x1?
ok sono dello stesso tipo (ossia Animale) ma dopo avrei un animale col metodo abbaia, ma non è detto che quell'animale sia perforza un cane
è la stessa identica cosa:
Animale animale=new Cane() SI
Cane cane=new Animale() NO
comunque il mio ragionamento è solo teorico, ti semplifica le cose, perchè in realtà anche se esegui il cast non puoi usare il metodo abbaia con la classe animale, quindi animale.abbaia() non va bene anche dopo aver fatto un animale=cane.
non mi torna in che gerarchia sta
Animale x1 = new Cane()
Animale X2 = new Animale()
x2 = x1?
ok sono dello stesso tipo (ossia Animale) ma dopo avrei un animale col metodo abbaia, ma non è detto che quell'animale sia perforza un caneSe x1 e x2 sono di tipo Animale, potrai invocare (su queste variabili) solamente i metodi che esistono nella classe Animale. Se nella classe Cane c'è un metodo abbaia() (che non c'è in Animale), non potrai chiamarlo! (dovresti fare un cast)
Se invece la classe Animale ha un metodo mangia(), e la classe Cane fa l'override del metodo per diversificarlo/specializzarlo, allora:
Animale x1 = new Cane();
x1.mangia ();
chiamerà l'implementazione di mangia() in Cane, non quello in Animale.
non mi torna in che gerarchia sta
Animale x1 = new Cane()
Animale X2 = new Animale()
x2 = x1?
ok sono dello stesso tipo (ossia Animale) ma dopo avrei un animale col metodo abbaia, ma non è detto che quell'animale sia perforza un cane
Lo puoi fare ma non hai lostesso i metodi di cane.
ok quindi un
Animale x = new Cane()
è un x che ha i metodi di Animale, NON ha i metodi di Cane ma diventa un Cane a tutti gli effetti con il cast:
(Cane)x
gh :stordita:
Animale x = new Cane()
è un x che ha i metodi di Animale, NON ha i metodi di CaneNon è espresso benissimo ma è così. Tramite la variabile 'x' tu puoi vedere solamente un "Animale". Un Cane infatti si comporta sicuramente (e come minimo) come un Animale.
Quando viene eseguita la compilazione, per determinare se un metodo è richiamabile oppure no, il compilatore si basa esclusivamente sul tipo del reference.
Es.
Animale x = new Cane ();
x.mangia ();
x.abbaia ();
Il compilatore va a vedere: esiste il metodo mangia() in Animale? Sì, allora è ok. Esiste il metodo abbaia() in Animale? No, errore in compilazione.
È poi a run-time, quando il programma viene eseguito che x.mangia() va a chiamare il metodo corretto, cioè quello implementato (eventualmente) in Cane piuttosto che quello in Animale.
ma diventa un Cane a tutti gli effetti con il cast:
(Cane)xSì, volendo (per un qualche motivo) usarlo come Cane, si può fare:
((Cane)x).abbaia ()
tutto chiarito
x che abbaia non morde...più :D
grazie!
vBulletin® v3.6.4, Copyright ©2000-2026, Jelsoft Enterprises Ltd.