Что такое композиция, относящаяся к объектно-ориентированному дизайну?

Я слышу (и читаю на этом сайте) много о «одобрении композиции над наследованием».

Но что такое Compositon? Я понимаю наследование от точки Person: Mammal: Animal, но я не могу увидеть определение Compostion нигде. Может ли кто-нибудь меня заполнить?

Композиция относится к объединению простых типов для создания более сложных. В вашем примере композиция может быть:

Animal: Skin animalSkin Organs animalOrgans Mammal::Animal: Hair/fur mammalFur warm-blooded-based_cirulation_system heartAndStuff Person::Mammal: string firstName string lastName 

Если вы хотите полностью составить композицию (и избавиться от всего наследования), она будет выглядеть так:

 Animal: Skin animalSkin Organs animalOrgans Mammal: private Animal _animalRef Hair/fur mammalFur warm-blooded-based_cirulation_system heartAndStuff Person: private Mammal _mammalRef string firstName string lastName 

Преимущество такого подхода заключается в том, что типы Mammal и Person не должны соответствовать интерфейсу их предыдущего родителя. Это может быть хорошо, потому что иногда изменение суперclassа может иметь серьезные последствия для подclassов. Они по-прежнему могут иметь доступ к свойствам и поведениям этих classов через свои частные экземпляры этих classов, и если они хотят разоблачить поведение прежнего суперclassа, они могут просто обернуть их публичным методом.

Я нашел хорошую ссылку с хорошими примерами здесь: http://www.artima.com/designtechniques/compoinh.html

Композиция – это просто части, которые составляют целое. У автомобиля есть колеса, двигатель и сиденья. Наследование – это «есть» связь. Композиция – это «имеет» отношения.

Существует три способа дать поведение classу. Вы можете написать это поведение в classе; вы можете наследовать от classа, который имеет желаемое поведение; или вы можете включить class с желаемым поведением в свой class как поле или переменную-член. Последние два представляют собой формы повторного использования кода, а окончательный – состав – обычно предпочтительнее. Это действительно не дает вашему classу желаемого поведения – вам все равно нужно вызвать метод в поле, но он ставит меньше ограничений на ваш дизайн и результаты вашего classа, чтобы легче тестировать и легче отлаживать код. Наследование имеет свое место, но композиция должна быть предпочтительной.

 class Engine { } class Automobile { } class Car extends Automobile // car "is a" automobile //inheritance here { Engine engine; // car "has a" engine //composition here } 

Состав. Функциональность объекта состоит из совокупности разных classов. На практике это означает наличие указателя на другой class, на который откладывается работа.

Наследование. Функциональность объекта состоит из собственной функциональности плюс функциональность из своих родительских classов.

Что касается того, почему композиция предпочтительнее над наследованием, взгляните на проблему Circle-Ellipse .

Пример композиции – это то, где у вас есть экземпляр classа внутри другого classа, вместо того, чтобы наследовать его

На этой странице есть хорошая статья, объясняющая, почему люди говорят «предпочитают композицию над наследованием» с некоторыми примерами того, почему.

  • Как найти пару с k-й наибольшей суммой?
  • Что такое lambda?
  • Как определить тип кредитной карты на основе номера?
  • Линия пересечения двух плоскостей
  • Сортировать по:
  • Что такое инъекция зависимости?
  • Болт-коллаж - обнаружение и обработка
  • Алгоритм генерации анаграмм
  • Что такое непрозрачное значение в C ++?
  • Является ли двойным действительно неподходящим для денег?
  • Существует ли алгоритм сортировки по целому числу O (n)?
  • Давайте будем гением компьютера.