Что такое композиция, относящаяся к объектно-ориентированному дизайну?
Я слышу (и читаю на этом сайте) много о «одобрении композиции над наследованием».
Но что такое Compositon? Я понимаю наследование от точки Person: Mammal: Animal, но я не могу увидеть определение Compostion нигде. Может ли кто-нибудь меня заполнить?
- Сбита ли математика с плавающей запятой?
- Изучение теории сбора мусора
- Лучший способ найти точку на круге, ближайшем к данной точке
- Сгенерировать список всех возможных перестановок строки
- Как проверить, пересекает ли сегмент линии прямоугольник?
- Алгоритм естественной сортировки
- Уравнение для тестирования, если точка находится внутри круга
- Что такое самоуверенное программное обеспечение?
- Как вы находите точку на заданном перпендикулярном расстоянии от линии?
- Как работает переопределение переменных XOR?
- Что такое lambda (функция)?
- Как измерить сходство между двумя изображениями?
- Для чего нужен пузырь?
Композиция относится к объединению простых типов для создания более сложных. В вашем примере композиция может быть:
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а, вместо того, чтобы наследовать его
На этой странице есть хорошая статья, объясняющая, почему люди говорят «предпочитают композицию над наследованием» с некоторыми примерами того, почему.