2011-03-17 2 views
1

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

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

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

Я что-то не хватает?

+0

Ответ зависит в какой-то степени от используемого языка. На каком языке или на каком языке вы заинтересованы? –

+0

На некоторых языках множественного наследования нет. Ваше предложение лишает вас возможности унаследовать некоторые функциональные возможности Folder от всего остального, чем File. – Voooza

+0

В настоящее время я использую C# (или java) – Avi

ответ

7

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

Это, по существу, Композитная модель, даже если вы не называйте это как то :-)

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

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

+0

Я спрашиваю об этом, потому что я испытал на собеседовании. Я не использовал составной шаблон. Я сделал простое наследование, потому что у файла нет ничего, что можно было бы скрывать от класса папки.и я уверен, что именно поэтому я не прошел, мое приложение работало так же, как они спрашивали. Спасибо за ссылку! – Avi

+0

@Avi, в общем классе дизайн не рекомендуется наследовать от конкретных классов; это почти всегда открывает двери для тонких проблем идентичности/сравнения и ошибок. Например. как бы вы написали 'File.compareTo()', принимая во внимание, что другой объект, с которым можно сравнить, может фактически быть 'Folder'? –

+0

Честно говоря, я не вижу разницы между простым наследованием и композицией в вашем примере. в обоих случаях файлы и папки не относятся к одному типу. – Avi

0

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

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

И, наконец, это зависит от используемого языка. В C++ наследование должно использоваться только для полиморфизма, а never for code-reuse. В таких языках, как Python, это неверно. Здесь вы можете достичь того же самого с составом и наследованием.

0

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

Смежные вопросы