Может ли наследство всегда быть заменено композицией? - PullRequest
0 голосов
/ 20 мая 2019

Мне стало интересно, существуют ли ситуации, когда наследование не может быть заменено композицией?

Возьмем, к примеру, простое наследование с перегрузкой:

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 реализуют один и тот же интерфейс, становится еще более очевидным, что два приведенных выше фрагмента соответствуют одному и тому же поведению.

Итак, вернемся к первоначальному вопросу: есть ли ситуации, когда нужно(или действительно, действительно следует) использовать наследование вместо композиции?

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

есть ли ситуации, когда наследство не может быть заменено композицией?

Нет!Но подумайте:

есть ли ситуации, когда наследование не должно заменяться составом?

Да!Представьте, что ваш класс Foo имеет 10 методов.Используя композицию, вы должны переписать эти 10 методов в Bar.Код может быть простым, поскольку он делегирует большинство задач на Foo, но он все еще весьма разочаровывает.

Я не буду говорить о том, что люди называют «Есть» или «Имеет А», поскольку это не так.не имеет смысла для меня.Лично я считаю, что наследование / композиция - это все о повторном использовании кода.Что облегчает повторное использование кода в вашей ситуации, используйте его.Наследование в программировании не связано с таксономией, я обычно находил аналогии, такие как Animal / Dog / Cat ... бесполезно.

0 голосов
/ 20 мая 2019

Есть ли ситуации, когда нужно (или действительно, действительно) использовать наследование вместо композиции?

Когда какое-то поведение является абстрактным, имеет смысл выразить его наследованием, пытаясь выразить его композицией, которая может выглядеть неестественно / запутанно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...