oopdesign-patternslanguage-agnosticcomposition

What is composition as it relates to object-oriented design?


I hear (and read on this site) a lot about "favour composition over inheritance".

But what is composition? I understand inheritance from the point of Person : Mammal : Animal, but I can't really see the definition of composition anywhere...


Solution

  • Composition refers to combining simple types to make more complex ones. In your example, composition could be:

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

    If you wanted to go totally composition (and get rid of all inheritance) it would look like this:

    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
    

    The advantage to this approach is that the types Mammal and Person do not have to conform to the interface of their previous parent. This could be a good thing because sometimes a change to the superclass can have serious effects on the subclasses.

    They still can have access to the properties and behaviours of these classes through their private instances of these classes, and if they want to expose these former-superclass behaviours, they can simply wrap them in a public method.

    I found a good link with good examples in Composition versus Inheritance. A Comparative Look at Two Fundamental Ways to Relate Classes.