Правда ли, что переопределение конкретных методов - это запах кода? Потому что я думаю, что если вам нужно переопределить конкретные методы:
public class A{
public void a(){
}
}
public class B extends A{
@Override
public void a(){
}
}
это можно переписать как
public interface A{
public void a();
}
public class ConcreteA implements A{
public void a();
}
public class B implements A{
public void a(){
}
}
и если B хочет повторно использовать a () в A, его можно переписать как:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
который не требует наследования для переопределения метода, это правда?
virtual
ключевое слово для поддержки переопределений. Таким образом, проблема становится более (или менее) неоднозначной из-за особенностей языка.
final
модификатор существует именно для таких ситуаций. Если поведение метода таково, что он не предназначен для переопределения, пометьте его как final
. В противном случае ожидайте, что разработчики могут переопределить его.