È vero che ignorare metodi concreti è un odore di codice? Perché penso che se hai bisogno di scavalcare metodi concreti:
public class A{
public void a(){
}
}
public class B extends A{
@Override
public void a(){
}
}
può essere riscritto come
public interface A{
public void a();
}
public class ConcreteA implements A{
public void a();
}
public class B implements A{
public void a(){
}
}
e se B vuole riutilizzare a () in A, può essere riscritto come:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
che non richiede l'ereditarietà per sovrascrivere il metodo, è vero?
virtual
parola chiave per supportare le sostituzioni. Quindi, il problema è reso più (o meno) ambiguo dai dettagli della lingua.
final
modificatore esiste esattamente per situazioni come queste. Se il comportamento del metodo è tale da non essere progettato per essere ignorato, contrassegnarlo come final
. Altrimenti, aspettati che gli sviluppatori possano scegliere di sovrascriverlo.