Difference between Inheritance and Composition

前端 未结 17 1962
忘了有多久
忘了有多久 2020-11-22 02:35

Are Composition and Inheritance the same? If I want to implement the composition pattern, how can I do that in Java?

17条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-22 03:19

    Composition is just as it sounds - you create an object by plugging in parts.

    EDIT the rest of this answer is erroneously based on the following premise.
    This is accomplished with Interfaces.
    For example, using the Car example above,

    Car implements iDrivable, iUsesFuel, iProtectsOccupants
    Motorbike implements iDrivable, iUsesFuel, iShortcutThroughTraffic
    House implements iProtectsOccupants
    Generator implements iUsesFuel
    

    So with a few standard theoretical components you can build up your object. It's then your job to fill in how a House protects its occupants, and how a Car protects its occupants.

    Inheritance is like the other way around. You start off with a complete (or semi-complete) object and you replace or Override the various bits you want to change.

    For example, MotorVehicle may come with a Fuelable method and Drive method. You may leave the Fuel method as it is because it's the same to fill up a motorbike and a car, but you may override the Drive method because the Motorbike drives very differently to a Car.

    With inheritance, some classes are completely implemented already, and others have methods that you are forced to override. With Composition nothing's given to you. (but you can Implement the interfaces by calling methods in other classes if you happen to have something laying around).

    Composition is seen as more flexible, because if you have a method such as iUsesFuel, you can have a method somewhere else (another class, another project) that just worries about dealing with objects that can be fueled, regardless of whether it's a car, boat, stove, barbecue, etc. Interfaces mandate that classes that say they implement that interface actually have the methods that that interface is all about. For example,

    iFuelable Interface:
       void AddSomeFuel()
       void UseSomeFuel()
       int  percentageFull()
    

    then you can have a method somewhere else

    private void FillHerUp(iFuelable : objectToFill) {
    
       Do while (objectToFill.percentageFull() <= 100)  {
    
            objectToFill.AddSomeFuel();
       }
    

    Strange example, but it's shows that this method doesn't care what it's filling up, because the object implements iUsesFuel, it can be filled. End of story.

    If you used Inheritance instead, you would need different FillHerUp methods to deal with MotorVehicles and Barbecues, unless you had some rather weird "ObjectThatUsesFuel" base object from which to inherit.

提交回复
热议问题