Newsgroup: it.comp.java
Titolo: Problema di downcasting (credo!)

Salve a tutti,
    cerco di spiegarmi alla meglio. Ho una classe factory che mi restituisce
oggetti di tipo Base.
    Ho definito una classe Derivata (da Base) e vorrei assegnarne ad una
istanza quanto restuito dalla factory di classi Base. Il codice che vi posto
di seguito solleva una eccezione di cast invalido a runtime. Non ho ben
capito se c'è qualcosa che mi sfugge nel codice o se il "pattern" che ho in
mente è proprio assurdo. C'è qualcuno che mi sa aiutare per favore?
class Base { ... }
class BaseFactory {
    ...
    public static Base build(...) {
        Base b = new Base();
        ...
        return b;
    }
}
class Derivata extends Base { ... }
... nel main ...
    BaseFactory myfactory = new...
    *** Derivata d = (Derivata) myfactory.build(...); ***

 ha scritto:

Ciao,
scritto cosi' il tuo codice e' scorretto, dal momento che cerchi di
eseguire un downcast di un reference della classe base verso uno di una
classe derivata, mentre l'oggetto indicato dal reference non e' del tipo
della classe derivata ma solo della classe base.
Per capirci, e' vero che un oggetto della classe derivata puo' essere
usato anche come se fosse uno della classe base, ma non e' vero il
contrario (un Cane e' anche un Animale, ma non necessariamente un Animale
e' un Cane).
Quello che hai in mente tu potrebbe avere senso nel caso in cui il metodo
build() potesse restituire anche oggetti delle classi derivate.
Ad esempio:
class BaseFactory {
    ...
    public static Base build(int p) {
        Base b;
        switch(b) {
          case 0: b = new Base(); break;
          case 1: b = new Derivata(); break;
        ...
        return b;
    }
}
Inoltre quando si esegue un downcast si dovrebbe sempre controllare se
esso e' possibile usando l'operatore instanceof:
Base b = myfactory.build(...);
Derivata d;
if (b instanceof Derivata) {
  d = (Derivata)b;
}
Un saluto
  Lucio
-- 
Lucio Benfante
Brainbench MVP For Java 1
http://www.brainbench.com

 ha scritto nel messaggio
news:20011205.16590...@mailandnews.com...


alternativo che pi permetta di usare oggetti di classi derivate da Element?
Costruiscili semplicemente, oppure creati una tua Factory se proprio ti 
serve.
Magari cerca di spiegare di più i tuoi requisiti/vincoli.
-- 
Ciao
	Fabrizio C.

istanza quanto restuito dalla factory di classi Base.
Il pattern di factory non si applica, in questo caso: una factory e' un
modo per costruire istanze concrete di classi astratte (base) senza
necessariamente sapere quale specifica classe concreta, perche' *quale*
particolare clase concreta e' irrilevante ai fini del codice client. 
Ad esempio, la clase Toolkit nelle librerie standard: a te non frega
nulla se sia Win32Toolkit, XToolkit o PippoToolkit.. t'interessa che
implementi le funzioni offerte da "Toolkit" - e il tuo codice 'vede' solo
Toolkit. 
Se invece il tuo codice client deve fare qualcosa a seconda del
sottotipo, non usi una factory. 
La linea guida e' che sia costruzione che uso della classe devono essere
uniformi per tutte le sottoclassi: esse incapsulano *la stessa idea* (nel
senso, hanno identica semantica), ma implementata in modo diverso
(tipicamente a seconda di piattaforma etc). 
Se invece la relazione di ereditarieta' implica anche modifiche
semantiche (aggiungi/togli metodi, diverso metodo di costruzione, etc),
factory non si applica. 
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun