Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

class Engine
{

}

class Automobile
{

}


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

}

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

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

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

Ответ 5

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

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