Чи правда, що переважаючі конкретні методи - це кодовий запах? Тому що я думаю, якщо вам потрібно перекрити конкретні методи:
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, його можна переписати як:
public class B implements A{
public ConcreteA concreteA;
public void a(){
concreteA.a();
}
}
що не потребує успадкування, щоб перекрити метод, це правда?
virtualключове слово, щоб підтримувати зміни. Отже, питання робиться більш (або менш) неоднозначним особливостями мови.
finalмодифікатор існує саме для таких ситуацій. Якщо поведінка методу така, що він не призначений для перекриття, то позначте його як final. В іншому випадку, сподівайтеся, що розробники можуть вирішити, що це може змінити.