Что такое композиция в отношении объектно-ориентированного дизайна? - PullRequest
60 голосов
/ 09 августа 2010

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

Но что такое Compositon?Я понимаю наследование с точки зрения Персона: Млекопитающее: Животное, но я нигде не вижу определения Композиции. Может кто-нибудь заполнить меня?

Ответы [ 5 ]

63 голосов
/ 09 августа 2010

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

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

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

40 голосов
/ 09 августа 2010

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

19 голосов
/ 09 августа 2010

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

17 голосов
/ 09 августа 2010
class Engine
{

}

class Automobile
{

}


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

}

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

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

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

5 голосов
/ 09 августа 2010

Пример композиции - это когда у вас есть экземпляр класса в другом классе, а не наследуется от него

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

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