Композиция относится к объединению простых типов в более сложные. В вашем примере состав может быть:
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