Состав и наследование.
Я знаю, что они оба являются инструментами для выбора, когда это необходимо, и контекст очень важен при выборе между композицией и наследованием. Однако обсуждение подходящего контекста для каждого из них обычно немного нечеткое; это приводит к тому, что я начинаю рассматривать, насколько отчетливо наследование и полиморфизм являются отдельными аспектами традиционного ООП.
Полиморфизм позволяет указывать отношения "is-a" одинаково, а также наследование. В частности, наследование из базового класса неявно создает полиморфную связь между этим классом и его подклассами. Однако, в то время как полиморфизм может быть реализован с использованием чистых интерфейсов, наследование усложняет полиморфную взаимосвязь, одновременно передавая детали реализации. Таким образом, наследование отличается от чистого полиморфизма.
В качестве инструмента наследование обслуживает программистов иначе, чем полиморфизм (через чистые интерфейсы), упрощая повторное использование реализации в тривиальных случаях. Однако в большинстве случаев детали реализации суперкласса тонко противоречат требованиям подкласса. Вот почему у нас есть "переопределения" и "сокрытие членов". В этих случаях повторное использование реализации, предлагаемое путем наследования, приобретается с добавлением усилий по проверке изменений состояния и путей выполнения на каскадных уровнях кода: полная "сглаженная" информация о реализации подкласса распространяется между несколькими классами, что обычно означает несколько файлов, из которых только отдельные части относятся к рассматриваемому подклассу. Просматривая эту иерархию, абсолютно необходимо иметь дело с наследованием, потому что, не глядя на код суперкласса, нет способа узнать, какие неперекрываемые детали обезьяны с вашим состоянием или отвлечение вашего исполнения.
Для сравнения, исключительное использование композиции гарантирует, что вы увидите, какое состояние может быть изменено с помощью явно созданных объектов, методы которых вызывается по вашему усмотрению. Поистине сглаженная реализация все еще не достигнута (и на самом деле это даже не желательно, поскольку преимущество структурированного программирования - это инкапсуляция и абстракция деталей реализации), но вы все равно получаете повторное использование кода, и вам нужно будет только посмотреть в одном месте когда код неверно работает.
С целью тестирования этих идей на практике, избегая традиционного наследования для комбинации чистого полиморфизма на основе интерфейса и состава объекта, мне интересно,
Есть ли что-нибудь, что состав объекта и интерфейсы не могут выполнить это наследование?
Edit
В ответах до сих пор, ewernli полагает, что нет технических умений, доступных для одного метода, но не другого; он позже упоминает, как разные шаблоны и подходы к дизайну присущи каждой технике. Это разумно. Тем не менее, это побуждает меня уточнить мой вопрос, спросив, запретит ли эксклюзивное использование композиции и интерфейсов вместо традиционного наследования использовать любые основные шаблоны проектирования? И если да, разве у вас нет эквивалентных шаблонов для использования в моей ситуации?