Est-il vrai que remplacer des méthodes concrètes est une odeur de code? Parce que je pense que si vous avez besoin de remplacer des méthodes concrètes:
public class A{
public void a(){
}
}
public class B extends A{
@Override
public void a(){
}
}
il peut être réécrit comme
public interface A{
public void a();
}
public class ConcreteA implements A{
public void a();
}
public class B implements A{
public void a(){
}
}
et si B veut réutiliser a () dans A, il peut être réécrit comme:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
qui ne nécessite pas d'héritage pour remplacer la méthode, est-ce vrai?
virtual
mot - clé pour prendre en charge les remplacements. Ainsi, la question est rendue plus (ou moins) ambiguë par les particularités de la langue.
final
modificateur existe exactement pour des situations comme celles-ci. Si le comportement de la méthode est tel qu'elle n'est pas conçue pour être remplacée, marquez-la comme final
. Sinon, attendez-vous à ce que les développeurs choisissent de le remplacer.