Difference between Inheritance and Composition

前端 未结 17 1847
忘了有多久
忘了有多久 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:16

    Composition means creating an object to a class which has relation with that particular class. Suppose Student has relation with Accounts;

    An Inheritance is, this is the previous class with the extended feature. That means this new class is the Old class with some extended feature. Suppose Student is Student but All Students are Human. So there is a relationship with student and human. This is Inheritance.

    0 讨论(0)
  • 2020-11-22 03:18

    How inheritance can be dangerous ?

    Lets take an example

    public class X{    
       public void do(){    
       }    
    }    
    Public Class Y extends X{
       public void work(){    
           do();    
       }
    }
    

    1) As clear in above code , Class Y has very strong coupling with class X. If anything changes in superclass X , Y may break dramatically. Suppose In future class X implements a method work with below signature

    public int work(){
    }
    

    Change is done in class X but it will make class Y uncompilable. SO this kind of dependency can go up to any level and it can be very dangerous. Every time superclass might not have full visibility to code inside all its subclasses and subclass may be keep noticing what is happening in superclass all the time. So we need to avoid this strong and unnecessary coupling.

    How does composition solves this issue?

    Lets see by revising the same example

    public class X{
        public void do(){
        }
    }
    
    Public Class Y{
        X x = new X();    
        public void work(){    
            x.do();
        }
    }
    

    Here we are creating reference of X class in Y class and invoking method of X class by creating an instance of X class. Now all that strong coupling is gone. Superclass and subclass are highly independent of each other now. Classes can freely make changes which were dangerous in inheritance situation.

    2) Second very good advantage of composition in that It provides method calling flexibility, for example :

    class X implements R
    {}
    class Y implements R
    {}
    
    public class Test{    
        R r;    
    }
    

    In Test class using r reference I can invoke methods of X class as well as Y class. This flexibility was never there in inheritance

    3) Another great advantage : Unit testing

    public class X {
        public void do(){
        }
    }
    
    Public Class Y {
        X x = new X();    
        public void work(){    
            x.do();    
        }    
    }
    

    In above example, if state of x instance is not known, it can easily be mocked up by using some test data and all methods can be easily tested. This was not possible at all in inheritance as you were heavily dependent on superclass to get the state of instance and execute any method.

    4) Another good reason why we should avoid inheritance is that Java does not support multiple inheritance.

    Lets take an example to understand this :

    Public class Transaction {
        Banking b;
        public static void main(String a[])    
        {    
            b = new Deposit();    
            if(b.deposit()){    
                b = new Credit();
                c.credit();    
            }
        }
    }
    

    Good to know :

    1. composition is easily achieved at runtime while inheritance provides its features at compile time

    2. composition is also know as HAS-A relation and inheritance is also known as IS-A relation

    So make it a habit of always preferring composition over inheritance for various above reasons.

    0 讨论(0)
  • Composition means HAS A
    Inheritance means IS A

    Example: Car has a Engine and Car is a Automobile

    In programming this is represented as:

    class Engine {} // The Engine class.
    
    class Automobile {} // Automobile class which is parent to Car class.
    
    class Car extends Automobile { // Car is an Automobile, so Car class extends Automobile class.
      private Engine engine; // Car has an Engine so, Car class has an instance of Engine class as its member.
    }
    
    0 讨论(0)
  • 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.

    0 讨论(0)
  • 2020-11-22 03:23

    In Simple Word Aggregation means Has A Relationship ..

    Composition is a special case of aggregation. In a more specific manner, a restricted aggregation is called composition. When an object contains the other object, if the contained object cannot exist without the existence of container object, then it is called composition. Example: A class contains students. A student cannot exist without a class. There exists composition between class and students.

    Why Use Aggregation

    Code Reusability

    When Use Aggregation

    Code reuse is also best achieved by aggregation when there is no is a Relation ship

    Inheritance

    Inheritance is a Parent Child Relationship Inheritance Means Is A RelationShip

    Inheritance in java is a mechanism in which one object acquires all the properties and behaviors of parent object.

    Using inheritance in Java 1 Code Reusability. 2 Add Extra Feature in Child Class as well as Method Overriding (so runtime polymorphism can be achieved).

    0 讨论(0)
  • 2020-11-22 03:26

    Are Composition and Inheritance the same?

    They are not same.

    Composition : It enables a group of objects have to be treated in the same way as a single instance of an object. The intent of a composite is to "compose" objects into tree structures to represent part-whole hierarchies

    Inheritance: A class inherits fields and methods from all its superclasses, whether direct or indirect. A subclass can override methods that it inherits, or it can hide fields or methods that it inherits.

    If I want to implement the composition pattern, how can I do that in Java?

    Wikipedia article is good enough to implement composite pattern in java.

    Key Participants:

    Component:

    1. Is the abstraction for all components, including composite ones
    2. Declares the interface for objects in the composition

    Leaf:

    1. Represents leaf objects in the composition
    2. Implements all Component methods

    Composite:

    1. Represents a composite Component (component having children)
    2. Implements methods to manipulate children
    3. Implements all Component methods, generally by delegating them to its children

    Code example to understand Composite pattern:

    import java.util.List;
    import java.util.ArrayList;
    
    interface Part{
        public double getPrice();
        public String getName();
    }
    class Engine implements Part{
        String name;
        double price;
        public Engine(String name,double price){
            this.name = name;
            this.price = price;
        }
        public double getPrice(){
            return price;
        }
        public String getName(){
            return name;
        }
    }
    class Trunk implements Part{
        String name;
        double price;
        public Trunk(String name,double price){
            this.name = name;
            this.price = price;
        }
        public double getPrice(){
            return price;
        }
        public String getName(){
            return name;
        }
    }
    class Body implements Part{
        String name;
        double price;
        public Body(String name,double price){
            this.name = name;
            this.price = price;
        }
        public double getPrice(){
            return price;
        }
        public String getName(){
            return name;
        }
    }
    class Car implements Part{
        List<Part> parts;
        String name;
    
        public Car(String name){
            this.name = name;
            parts = new ArrayList<Part>();
        }
        public void addPart(Part part){
            parts.add(part);
        }
        public String getName(){
            return name;
        }
        public String getPartNames(){
            StringBuilder sb = new StringBuilder();
            for ( Part part: parts){
                sb.append(part.getName()).append(" ");
            }
            return sb.toString();
        }
        public double getPrice(){
            double price = 0;
            for ( Part part: parts){
                price += part.getPrice();
            }
            return price;
        }   
    }
    
    public class CompositeDemo{
        public static void main(String args[]){
            Part engine = new Engine("DiselEngine",15000);
            Part trunk = new Trunk("Trunk",10000);
            Part body = new Body("Body",12000);
    
            Car car = new Car("Innova");
            car.addPart(engine);
            car.addPart(trunk);
            car.addPart(body);
    
            double price = car.getPrice();
    
            System.out.println("Car name:"+car.getName());
            System.out.println("Car parts:"+car.getPartNames());
            System.out.println("Car price:"+car.getPrice());
        }
    
    }
    

    output:

    Car name:Innova
    Car parts:DiselEngine Trunk Body
    Car price:37000.0
    

    Explanation:

    1. Part is a leaf
    2. Car contains many Parts
    3. Different Parts of the car have been added to Car
    4. The price of Car = sum of ( Price of each Part )

    Refer to below question for Pros and Cons of Composition and Inheritance.

    Prefer composition over inheritance?

    0 讨论(0)
提交回复
热议问题