Мне стало интересно, существуют ли ситуации, когда наследование не может быть заменено композицией?
Возьмем, к примеру, простое наследование с перегрузкой:
class Foo {
String getText() {
return "Text from foo";
}
}
class Bar extends Foo {
@Override
String getText() {
return "BAR> " + super.getText() + " <BAR";
}
}
Это можно заменить насостав такой:
class Bar {
Foo foo;
String getText() {
return "BAR> " + foo.getText() + " <BAR";
}
}
... в результате получается точно такой же результат.Если и Foo
, и Bar
реализуют один и тот же интерфейс, становится еще более очевидным, что два приведенных выше фрагмента соответствуют одному и тому же поведению.
Итак, вернемся к первоначальному вопросу: есть ли ситуации, когда нужно(или действительно, действительно следует) использовать наследование вместо композиции?