Newsgroup: it.comp.java
Titolo: chiamare metodi "nuovi" in sottoclassi di una stessa classebase

PS: scusate il titolo, ma non mi veniva fuori di meglio!
Allora, il problema, spero per voi semplice, e' il seguente:
ho der1, der2 che derivano da BASE (vincolo non modificabile) e devono
dialogare con una classe "altra" che poi restituisce dei risultati tramite
un metodo transfer(...) di der1,der2...
ma transfer(...) non c'e' in BASE, dovrei fare un classico cast ma solo a
runtime so che der ha chiamto "altra"! spero di essermi spiegato.
qui un po' di codice:
public class der1 extends BASE{//nella realta' BASE e' HttpServlet, ma penso
non conti
...
void transfer(...){}
}
public class der2 extends BASE{
...
void transfer(...){}
}
public class altra{
BASE chiamante;
altra(BASE par_chiam){
    chiamante=par_chiam;
    ...
    //faccio qualcosa
    //adesso devo restituire i risultati al chiamante tramite transfer(...);
    //come faccio? in BASE non c'e' il metodo transfer(...).
    //dovrei fare un cast alla classe derivata, ma quale derivata?
    //lo so solo a runtime! :-(
    chiamante.transfer(...);//non va bene, in BASE non c'e' transfer()!
}
}
GRAZIE dell'aiuto! :-)
--
Ciao by Allanon

prova con l'operatore "instanceof"
if (obj instanceof der1) {
 so che l'oggetto obj è istanza della classe der1
}
Ciao Daniele.

scusami tanto eh.....qual'è il problema?
a meno che non ci siano altri problemi dietro, dichiari l'ogetto
chiamante di tipo der 1 o 2 (tanto hai detto che sai quale lo chiama)
o sennò lo fai statico e buona notte al secchio
classe.transfer()

 runtime so che der ha chiamto "altra"! spero di essermi spiegato.
non so se ho capito bene il tuo problema, cmq ti scrivo questo esempio...
forse puo' essere utile.
// Altra.java
class Base {
}
class Der1 extends Base{
  public void transfer(){
    System.out.println("ho chiamato Der1.transfer()");
  }
}
class Der2 extends Base {
  public void transfer() {
    System.out.println("ho chiamato Der2.transfer()");
  }
}
public class Altra{
  public Base chiamante;
  Altra(Base par_chiam){
    chiamante = par_chiam;
    if (chiamante instanceof Der1)
      ((Der1)chiamante).transfer();
    else
      ((Der2)chiamante).transfer();
  }//chiaramente se invochi transfer() su Base ti verra' segnalata
   // un'eccezione che puoi comunque gestire
  public static void main(String[] args) {
    Der1 oggettoDer1 = new Der1();
    Der2 oggettoDer2 = new Der2();
    Altra oggettoAltra = new Altra(oggettoDer1);
    Altra oggettoAltra2 = new Altra(oggettoDer2);
  }
}
di seguito c'e' quello che viene stampato:
ho chiamato Der1.transfer()
ho chiamato Der2.transfer()
P.S. una soluzione migliore, se e' questo il tuo problema, e'
creare una interfaccia che metta a disposizione il metodo
transfer() e fare in modo che Der1 e Der2 implementino
quelll'interfaccia.

 per poi passargli una qualunque sottoclasse diversa runtime. No?
infatti, e questa e' una pecca di java che non gli perdonero' mai! :-(
in C++ infatti il late binding dei metodi funziona in maniera molto migliore
con le chimate virtuali,
in questo caso dovrei fare o una serai di if(instanceOf...) + cast, cosa
orribile e poco manutenibile.
la soluzione invece e' stata quella proposta da "OyoOyo" in un altro msg.
vedi altro mio reply! :-)
cmq grazie dell'aiuto! :-)
--
Ciao by Allanon

 quelll'interfaccia.
la soluzione e' stata proprio questa (circa). il fatto e' che l'interfaccia
va implementata anche nella classe BASE, altrimenti sono da capo! e la
classe BASE e' HttpServlet di java, quindi non modificabile.
soluzione provata e funzionante:
public class BASE{
    //classe BASE che non si puo' cambiare (libreria java)
}
public interface returnFromDB{
    public void transfer();
}
public abstract class MyBase  extends BASE implements returnFromDB{
    //classe base astratta
}
public class myDer1 extends MyBase{
    public void transfer(){
        System.out.println("der1");
    }
}
...
public class myDerN extends MyBase{
    public void transfer(){
        System.out.println("derN");
    }
}
public class altra{
    MyBase member;
    altra(MyBase par){
        member=punt;
        member.transfer();
    }
    public static void main(String args[]){
        altra a1 = new altra(new myDer1());
        altra aN = new altra(new myDerN());
    }
}
output:
der1
derN
che ne dite? soluzioni altrnative migliori?
anche se questa mi sembra gia' un valido work-around al problema!
--
Ciao by Allanon

}
Ti propongo (sempre se puoi) di derivare una classe "intermedia" da 
BASE e nell'interfaccia di questa dichiarare transfer(); poi derivare 
da "intermedia" der1 e der2. Nel costruttore di "altra" ti dimentichi 
di BASE e usi "intermedia".
Oppure potresti creare un'interfaccia con il metodo transfer() e 
implementarla in der1  e der2, ma non so se in "altra" usi altri metodi 
di BASE.
Spero di essermi spiegato a sufficienza: facci sapere qualcosa.
PS
Mi sono accorto che hai già risolto quasi così, ma posto ugualmente per 
non buttare via il (prezioso) messaggio ;-)
-- 
Ciao
	Fabrizio C.

 orribile e poco manutenibile.
Siamo alle solite, C++ ti permette di fare tutto vero... ma questo implica
un più ampio
margine d'errore (vedi tutto il linguaggio).
Ripeto, secondo me, una buona progettazione (come hanno anche proposto
sotto, mi sembra)
di interfaccia e altro consente più "OO"...., poi certo, devi lavorare come
vuole Java
(Stai programmando in Java e compili in Java, non programmando in Java e
vole compilare in C++, no? :-)) )
Non si sta discutendo su quale linguaggio sia
il migliore, come sempre lo si deve scegliere in funzione dei propri scopi.
cut cut

Ciao,
tutto il problema č che la classe base (httpservlet) per te non č
modificabile, suggerisco di costruirti una classe intermedia fra la classe
intoccabile e le due classi figlie, a questo punto sulla classe intermedia
puoi fare quello che vuoi.
Ciao!
IlLeva

 
abstract class Base extends HttpServlet {
 public abstract void metodo();
}
class D1 extends Base { 
 public void metodo();
}
...
-- 
Life's something u don't get out alive..
ObjectZone - 
http://space.tin.it/computer/csadun

 non buttare via il (prezioso) messaggio ;-)
Grazie lo stesso, a te e a tutti! :-)
--
Ciao by Allanon

 il migliore, come sempre lo si deve scegliere in funzione dei propri
scopi.
su questo non si discute, puro vangelo! :-)
--
Ciao by Allanon

 ha scritto nel messaggio
news:9tobfv$3tqp2$1...@ID-50303.news.dfncis.de...
