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?
virtualmot - clé pour prendre en charge les remplacements. Ainsi, la question est rendue plus (ou moins) ambiguë par les particularités de la langue.
finalmodificateur 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.