具体的なメソッドをオーバーライドするのはコードの匂いだというのは本当ですか?なぜなら、具体的なメソッドをオーバーライドする必要があると思うからです:
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
。それ以外の場合、開発者がそれをオーバーライドすることを選択できることを期待してください。