Преимущества Composite Pattern перед простым наследованием - PullRequest
1 голос
/ 17 марта 2011

Я пытаюсь понять, почему составная часть лучше простого наследования.

Например, допустим, мы хотим реализовать файловую систему. Так что в основном нам нужны файлы и папки. Мы можем использовать составной шаблон, в то время как классы File и Folder наследуют базовый интерфейс, а класс Folder содержит коллекцию типов интерфейса.

Но мне кажется (во всяком случае, мне), что простое наследование может делать то же самое. Если File является корневым классом и Folder наследуется от File, Folder может содержать коллекцию File s, конец истории.

Я что-то упустил?

Ответы [ 4 ]

7 голосов
/ 17 марта 2011

, если File является корневым классом, а папка наследует File, папка может содержать коллекцию файлов

Это по сути шаблон Composite, даже если вы не называете его таким образом: -)

За исключением того, что в вашем варианте Папка будет наследовать специфичные для файла функции, которые она не может (или, что еще хуже, не должна) использовать.Таким образом, вы усложняете реализацию, чтобы, например, клиенты не могли добавлять байты в «конец» вашей папки и т. Д.

FYI, продолжение книги GoF, Pattern Hatching, обсуждает реализацию файловой системы с использованием различных шаблонов, в том числе Composite.Настоятельно рекомендуется прочитать.

0 голосов
/ 30 апреля 2011

Я бы порекомендовал вам лучше пройти этот PDF: - http://userpages.umbc.edu/~tarr/dp/lectures/Composite-2pp.pdf этот PDF определенно поможет вам. Спасибо.

0 голосов
/ 21 марта 2011

Я бы порекомендовал вам книгу Head First Design Patterns, первая глава под названием «Введение в шаблоны проектирования» рассказывает о шаблоне стратегии, и есть очень подробный пример, который вы можете узнать сами о композиции и почему мы предпочитаем композицию наследованию. 1001 *

0 голосов
/ 17 марта 2011

Одно важное отличие становится очевидным в вашем примере.Наследование в большинстве языков является механизмом времени компиляции.Вы определяете отношения классов в вашем исходном коде.

Композиция часто сочетается с наследованием (скорее всего полиморфизм ).Вы можете решить во время выполнения, как составлять сложные объекты, если части имеют полиморфный интерфейс.

Наконец, это зависит от используемого языка.В C ++ наследование должно использоваться только для полиморфизма, а никогда не для повторного использования кода .В таких языках, как Python, это не так.Здесь вы можете достичь того же с помощью композиции и наследования.

...