2012-02-23 6 views
15

Ho una classe A, con un metodo doAction astratta (BaseClass obj) in attesa di un param di tipo BaseClassPassando classe derivata per un metodo che ha bisogno di ignorare in attesa di un classe base

public class A { 
    //.... 
    abstract void doAction(BaseClass obj); 
    //.... 
} 

Ora, ho un altro la classe B che deve estendere A. Tuttavia, il metodo doAction di B deve utilizzare un oggetto DerivedClass che estende BaseClass.

public class B extends class A { 
    //.. 
    void doAction(DerivedClass obj) { 
      obj.callMethodAvailableOnlyInDerivedClass(); 
     } 

} 

Come faccio a gestire questa situazione in cui ho bisogno di passare param di tipo DerivedClass al metodo per essere sovrascritto mentre si aspetta un BaseClass?

Grazie!

risposta

20

a fare la classe base generica:

public class A<T extends BaseClass> { 
    //.... 
    abstract void doAction(T obj); 
    //.... 
} 

e la sottoclasse parametrizzato con la classe derivata:

public class B extends A<DerivedClass> { 
    //.. 
    void doAction(DerivedClass obj) { 
     obj.callMethodAvailableOnlyInDerivedClass(); 
    } 
} 

Senza di farmaci generici, non è possibile perché B romperebbe il contratto di A: A accetta qualsiasi tipo di BaseClass, ma si limita B a solo accettare una sottoclasse specifica. Questo non rispetta lo Liskov principle.

+0

+1 per il principio di Liskov. La prima volta che ne sento parlare, grazie! – GETah

+1

E se hai un sacco di questi metodi che agiscono su oggetti diversi ?! –

4

È possibile utilizzare:

public abstract class A<T extends BaseClass> { 
//.... 
abstract void doAction(T obj); 
//.... 
} 


public class B extends class A<DerivedClass> { 
//.. 
void doAction(DerivedClass obj) { 
     obj.callMethodAvailableOnlyInDerivedClass(); 
    } 

} 
1

Non c'è alcun parametro Contra-Variance in java, poiché non è sicuro.

Si supponga di avere A a = new B();

E poi si richiama a.doAction(new BaseClass()) Che cosa accadrà?

Causa un errore di runtime, poiché B non sa "cosa fare" con un . java vuole evitarlo - quindi non c'è covarianza di parametri.

Problemi correlati