¿Es cierto que anular métodos concretos es un olor a código? Porque creo que si necesita anular métodos concretos:
public class A{
public void a(){
}
}
public class B extends A{
@Override
public void a(){
}
}
se puede reescribir como
public interface A{
public void a();
}
public class ConcreteA implements A{
public void a();
}
public class B implements A{
public void a(){
}
}
y si B quiere reutilizar a () en A, puede reescribirse como:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
que no requiere herencia para anular el método, ¿es eso cierto?
virtual
palabra clave para admitir anulaciones. Entonces, el tema se hace más (o menos) ambiguo por los detalles del lenguaje.
final
modificador existe exactamente para situaciones como estas. Si el comportamiento del método es tal que no está diseñado para ser anulado, márquelo como final
. De lo contrario, espere que los desarrolladores puedan optar por anularlo.