2012-02-23 13 views
15

tengo una clase A, con un doAction método abstracto (BaseClass obj) esperando un parámetro de BaseClass tipoPasando clase derivada a un método que necesita para anular esperando una clase base

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

Ahora, tengo otra clase B que necesita extenderse A. Sin embargo, el método doAction de B necesita usar un objeto DerivedClass que extienda BaseClass.

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

} 

¿Cómo manejo esta situación donde tengo que pasar parámetro de tipo DerivedClass con el método a ser anulado mientras se está esperando un BaseClass?

Gracias!

Respuesta

20

a tomar la clase base genérica:

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

y la subclase parametrizado con la clase derivada:

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

Sin genéricos, no es posible porque B rompería el contrato de A: A acepta cualquier clase de BaseClass, pero usted retrotrae a B para que solo acepte una subclase específica. Esto no respeta el Liskov principle.

+0

+1 para el principio de Liskov. ¡La primera vez que me enteré, gracias! – GETah

+1

Y si tiene muchos de estos métodos actuando sobre diferentes objetos? –

4

Se puede utilizar:

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

No hay Contra-Variance de parámetros en java, ya que no es seguro.

Suponga que tiene A a = new B();

Y entonces se invoca a.doAction(new BaseClass()) ¿Qué pasará?

Causa un error de tiempo de ejecución, ya que B no sabe "qué hacer" con un BaseClass. java quiere evitarlo, por lo que no hay covarianza de parámetros.

Cuestiones relacionadas