Unterschied zwischen Vererbung und Zusammensetzung

208

Sind Zusammensetzung und Vererbung gleich? Wie kann ich das in Java implementieren, wenn ich das Kompositionsmuster implementieren möchte?

gmhk
quelle
2
Andere verwandte Frage: Gibt es etwas, was die Komposition nicht erreichen kann, was die Vererbung kann? stackoverflow.com/questions/2238642/…
ewernli
1
Siehe auch is-a-vs-has-a-which-one-is-
Better
1
Dieser Artikel war nützlich für mich und hat mir geholfen : oughtworks.com/insights/blog/…
QMaster
Schauen
The Mighty Programmer

Antworten:

321

Sie sind absolut unterschiedlich. Vererbung ist eine "ist-eine" Beziehung. Zusammensetzung ist ein "has-a" .

Sie komponieren, indem Sie eine Instanz einer anderen Klasse Cals Feld Ihrer Klasse verwenden, anstatt sie zu erweitern C. Ein gutes Beispiel, bei dem die Komposition viel besser gewesen wäre als die Vererbung, ist java.util.Stackdas derzeit erweiterte java.util.Vector. Dies wird jetzt als Fehler angesehen. Ein Stapelvektor "ist NICHT ein" ; Es sollte Ihnen nicht gestattet sein, Elemente willkürlich einzufügen und zu entfernen. Es hätte stattdessen Komposition sein sollen.

Leider ist es zu spät, um diesen Entwurfsfehler zu beheben, da eine Änderung der Vererbungshierarchie die Kompatibilität mit vorhandenem Code beeinträchtigen würde. Wenn StackKomposition anstelle von Vererbung verwendet wurde, kann sie jederzeit geändert werden, um eine andere Datenstruktur zu verwenden, ohne die API zu verletzen .

Ich kann Josh Blochs Buch Effective Java 2nd Edition nur empfehlen

  • Punkt 16: Komposition gegenüber Vererbung bevorzugen
  • Punkt 17: Design und Dokument für die Vererbung oder verbieten es

Bei einem guten objektorientierten Design geht es nicht darum, vorhandene Klassen großzügig zu erweitern. Ihr erster Instinkt sollte sein, stattdessen zu komponieren.


Siehe auch:

Polygenschmierstoffe
quelle
4
Interessant. Warum nicht einfach eine neue Klasse java.util.Stack2 erstellen, die Komposition verwendet?
Qed
5
Ich schätze diese Antwort; Ich habe jedoch das Gefühl, dass die Antwort aus der Bahn gerät und sich mehr mit Bedenken hinsichtlich des Designs der Sprache (und eines bestimmten Pakets) befasst als mit der Beantwortung der gestellten Frage zu Komposition vs. Vererbung. Ich bin ein großer Fan der Beantwortung der Frage zu SO unter Berufung auf Ressourcen - keine Verknüpfung mit externen Ressourcen, ohne eine ausführlichere Zusammenfassung als eine einzeilige Zusammenfassung bereitzustellen.
Thomas
5
Schlechtes Beispiel, ich musste extra suchen, um zu verstehen, was Vektor und Stapel sind.
Sam Ramezanli
Gut, aber Ihr Beispiel für Java Stack ist kein guter Kandidat, da diese Vererbung ein Beispiel für eine schlechte Entscheidung über die Wahl der Vererbung gegenüber der Komposition ist, wie in diesem Artikel erwähnt : oughtworks.com/insights/blog/…
QMaster
212

Zusammensetzung bedeutet HAS A
Vererbung bedeutetIS A

Example: Auto hat einen Motor und Auto ist ein Automobil

In der Programmierung wird dies dargestellt als:

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.
}
Codaddict
quelle
7
Ich würde "Automobil" in "angetriebenes Fahrzeug" ändern, da in vielen Interpretationen Autos und Autos gleichwertig sind.
Nanofarad
5
@hexafraction Ich stimme zu, dass Fahrzeug wahrscheinlich eine bessere Wahl wäre, aber gleichzeitig hat -codaddict- den Punkt für das, was gefragt wurde, gut illustriert.
Nckbrz
5
"ein Motor":-/
Omar Tariq
schön erklärt. +1. Lesen Sie
Roottraveller
@AndreyAkhmetov Automobile kann typeFeld vom Typ habenEnum
Ojonugwa Jude Ochalifu
42

Wie gefährlich kann Vererbung sein?

Nehmen wir ein Beispiel

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

1) Wie im obigen Code klar, hat Klasse Y eine sehr starke Kopplung mit Klasse X. Wenn sich in der Oberklasse X etwas ändert, kann Y dramatisch brechen. Angenommen, Klasse X implementiert in Zukunft eine Methodenarbeit mit der folgenden Signatur

public int work(){
}

Änderungen werden in Klasse X vorgenommen, aber Klasse Y wird nicht kompilierbar. SO kann diese Art von Abhängigkeit bis zu jeder Ebene gehen und es kann sehr gefährlich sein. Jedes Mal, wenn die Oberklasse möglicherweise nicht die volle Sichtbarkeit des Codes in allen Unterklassen hat und die Unterklasse möglicherweise ständig bemerkt, was in der Oberklasse passiert. Wir müssen also diese starke und unnötige Kopplung vermeiden.

Wie löst die Komposition dieses Problem?

Sehen wir uns das gleiche Beispiel an

public class X{
    public void do(){
    }
}

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

Hier erstellen wir eine Referenz der X-Klasse in der Y-Klasse und rufen die Methode der X-Klasse auf, indem wir eine Instanz der X-Klasse erstellen. Jetzt ist all diese starke Kopplung weg. Oberklasse und Unterklasse sind jetzt sehr unabhängig voneinander. Klassen können frei Änderungen vornehmen, die in der Vererbungssituation gefährlich waren.

2) Zweitens ein sehr guter Vorteil der Komposition, da sie Flexibilität beim Aufrufen von Methoden bietet, zum Beispiel:

class X implements R
{}
class Y implements R
{}

public class Test{    
    R r;    
}

In der Testklasse mit der Referenz r kann ich sowohl Methoden der X-Klasse als auch der Y-Klasse aufrufen. Diese Flexibilität war bei der Vererbung nie vorhanden

3) Ein weiterer großer Vorteil: Unit Testing

public class X {
    public void do(){
    }
}

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

Wenn im obigen Beispiel der Status der x-Instanz nicht bekannt ist, kann er mithilfe einiger Testdaten leicht nachgebildet werden, und alle Methoden können problemlos getestet werden. Dies war bei der Vererbung überhaupt nicht möglich, da Sie stark von der Oberklasse abhängig waren, um den Instanzstatus abzurufen und eine Methode auszuführen.

4) Ein weiterer guter Grund, warum wir Vererbung vermeiden sollten, ist, dass Java keine Mehrfachvererbung unterstützt.

Nehmen wir ein Beispiel, um dies zu verstehen:

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

Gut zu wissen :

  1. Die Komposition ist zur Laufzeit leicht zu erreichen, während die Vererbung ihre Funktionen zur Kompilierungszeit bereitstellt

  2. Zusammensetzung wird auch als HAS-A-Beziehung bezeichnet, und Vererbung wird auch als IS-A-Beziehung bezeichnet

Machen Sie es sich also zur Gewohnheit, aus verschiedenen oben genannten Gründen immer die Komposition der Vererbung vorzuziehen.

Manoj Kumar Saini
quelle
3
stimme zu, aber wenn du deine Lösung mit Komposition verwendest ... müssen wir zum Beispiel noch einen Babysitter machen, jetzt ändert die Superklasse X den Methodennamen von "do" in "do" ... dann muss auch die Unterklasse Y beibehalten werden (muss geändert werden) auch) das ist noch enge kupplung? Und wie werden wir es los?
Stuckedoverflow
19

Die Antwort von @Michael Rodrigues ist nicht korrekt (ich entschuldige mich; ich kann nicht direkt kommentieren) und könnte zu Verwirrung führen.

Die Schnittstellenimplementierung ist eine Form der Vererbung . Wenn Sie eine Schnittstelle implementieren, erben Sie nicht nur alle Konstanten, sondern verpflichten Ihr Objekt zu dem von der Schnittstelle angegebenen Typ. Es ist immer noch eine " ist-eine " Beziehung. Wenn ein Auto implementiert Fillable , das Auto „ ist-aFillable und kann in Ihrem Code verwendet werden , wo auch immer Sie verwenden würden Fillable .

Die Zusammensetzung unterscheidet sich grundlegend von der Vererbung. Wenn Sie Komposition verwenden, stellen Sie (wie in den anderen Antworten angegeben) eine " has-a " -Beziehung zwischen zwei Objekten her, im Gegensatz zu der " is-a " -Beziehung, die Sie bei Verwendung der Vererbung herstellen .

Wenn ich also anhand der Autobeispiele in den anderen Fragen sagen möchte, dass ein Auto einen Gastank hat , würde ich die Zusammensetzung wie folgt verwenden:

public class Car {

private GasTank myCarsGasTank;

}

Hoffentlich klärt das Missverständnisse auf.

Kris
quelle
17

Vererbung bringt IS-A- Beziehung hervor. Die Zusammensetzung bringt die HAS-A-Beziehung hervor . Das Strategiemuster erklärt, dass die Zusammensetzung in Fällen verwendet werden sollte, in denen es Familien von Algorithmen gibt, die ein bestimmtes Verhalten definieren.
Ein klassisches Beispiel für eine Entenklasse, die ein Flugverhalten implementiert.

public interface Flyable{
 public void fly();
}

public class Duck {
 Flyable fly;

 public Duck(){
  fly = new BackwardFlying();
 }
}

Somit können wir mehrere Klassen haben, die das Fliegen implementieren, z.

public class BackwardFlying implements Flyable{
  public void fly(){
    Systemout.println("Flies backward ");
  }
}
public class FastFlying implements Flyable{
  public void fly(){
    Systemout.println("Flies 100 miles/sec");
  }
}

Wäre es eine Vererbung gewesen, hätten wir zwei verschiedene Vogelklassen, die die Fliegenfunktion immer wieder implementieren. Vererbung und Zusammensetzung sind also völlig unterschiedlich.

reibungslose Riemenscheibe
quelle
7

Komposition ist so, wie es sich anhört - Sie erstellen ein Objekt, indem Sie Teile einstecken.

BEARBEITEN Der Rest dieser Antwort basiert fälschlicherweise auf der folgenden Prämisse.
Dies wird mit Schnittstellen erreicht.
Verwenden Sie Carbeispielsweise das obige Beispiel:

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

Mit ein paar theoretischen Standardkomponenten können Sie Ihr Objekt aufbauen. Es ist dann Ihre Aufgabe, anzugeben, wie ein Houseseine Insassen schützt und wie ein Carseine Insassen schützt.

Vererbung ist wie umgekehrt. Sie beginnen mit einem vollständigen (oder halbfertigen) Objekt und ersetzen oder überschreiben die verschiedenen Bits, die Sie ändern möchten.

Zum Beispiel MotorVehiclekann mit einer FuelableMethode und DriveMethode kommen. Sie können die Kraftstoffmethode so lassen, wie sie ist, weil es dasselbe ist, ein Motorrad und ein Auto zu tanken, aber Sie können die DriveMethode überschreiben , weil das Motorrad ganz anders fährt als einCar .

Bei der Vererbung sind einige Klassen bereits vollständig implementiert, andere verfügen über Methoden, die Sie überschreiben müssen. Mit Komposition wird dir nichts gegeben. (Sie können die Schnittstellen jedoch implementieren, indem Sie Methoden in anderen Klassen aufrufen, wenn zufällig etwas herumliegt.)

Die Komposition wird als flexibler angesehen, denn wenn Sie eine Methode wie iUsesFuel haben, können Sie eine andere Methode (eine andere Klasse, ein anderes Projekt) verwenden, die sich nur um den Umgang mit Objekten kümmert, die betankt werden können, unabhängig davon, ob es sich um ein Auto handelt. Boot, Herd, Grill usw. Schnittstellen schreiben vor, dass Klassen, die sagen, dass sie diese Schnittstelle implementieren, tatsächlich die Methoden haben, um die es bei dieser Schnittstelle geht. Beispielsweise,

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

dann können Sie eine Methode woanders haben

private void FillHerUp(iFuelable : objectToFill) {

   Do while (objectToFill.percentageFull() <= 100)  {

        objectToFill.AddSomeFuel();
   }

Seltsames Beispiel, aber es zeigt, dass es dieser Methode egal ist, was sie füllt, da das Objekt implementiert iUsesFuel, es kann gefüllt werden. Ende der Geschichte.

Wenn Sie stattdessen Vererbung verwenden würden, würden Sie verschiedene FillHerUpMethoden benötigen , um mit MotorVehiclesund umzugehen Barbecues, es sei denn, Sie hätten ein ziemlich seltsames "ObjectThatUsesFuel" -Basisobjekt, von dem Sie erben könnten.

Michael Rodrigues
quelle
Java-Konventionen besagen, dass Klassen- und Schnittstellennamen in ThisCaseund nicht in geschrieben werden camelCase. Daher ist es am besten, Ihre Schnittstellen IDrivableusw. zu benennen . Möglicherweise benötigen Sie das "I" nicht, wenn Sie alle Ihre Schnittstellen korrekt in einem Paket gruppieren.
ThePyroEagle
6

Sind Zusammensetzung und Vererbung gleich?

Sie sind nicht gleich.

Zusammensetzung : Damit kann eine Gruppe von Objekten wie eine einzelne Instanz eines Objekts behandelt werden. Die Absicht eines Verbunds ist es, Objekte in Baumstrukturen zu "komponieren", um Teil-Ganz-Hierarchien darzustellen

Vererbung : Eine Klasse erbt Felder und Methoden von allen direkten oder indirekten Oberklassen. Eine Unterklasse kann von ihr geerbte Methoden überschreiben oder von ihr geerbte Felder oder Methoden ausblenden.

Wie kann ich das in Java implementieren, wenn ich das Kompositionsmuster implementieren möchte?

Der Wikipedia- Artikel ist gut genug, um zusammengesetzte Muster in Java zu implementieren.

Geben Sie hier die Bildbeschreibung ein

Hauptteilnehmer:

Komponente :

  1. Ist die Abstraktion für alle Komponenten, einschließlich zusammengesetzter
  2. Deklariert die Schnittstelle für Objekte in der Komposition

Blatt :

  1. Repräsentiert Blattobjekte in der Komposition
  2. Implementiert alle Komponenten Methoden

Zusammengesetzt :

  1. Stellt eine zusammengesetzte Komponente dar (Komponente mit untergeordneten Elementen)
  2. Implementiert Methoden zur Manipulation von Kindern
  3. Implementiert alle Komponentenmethoden, indem sie im Allgemeinen an ihre untergeordneten Elemente delegiert werden

Codebeispiel zum Verständnis des zusammengesetzten Musters:

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());
    }

}

Ausgabe:

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

Erläuterung:

  1. Teil ist ein Blatt
  2. Auto enthält viele Teile
  3. Verschiedene Teile des Autos wurden zu Auto hinzugefügt
  4. Der Preis des Autos = Summe von (Preis jedes Teils )

Beziehen Sie sich auf die folgende Frage für Vor- und Nachteile der Zusammensetzung und Vererbung.

Komposition lieber als Vererbung?

Ravindra Babu
quelle
Ist es sinnvoll, Teile auch für die Fahrzeugklasse zu implementieren? Wird es nicht gut sein, wenn Sie es als Komposition verwenden
bhalkian
4

Betrachten Sie als weiteres Beispiel eine Fahrzeugklasse. Dies wäre eine gute Verwendung der Zusammensetzung. Ein Auto hätte einen Motor, ein Getriebe, Reifen, Sitze usw. Es würde keine dieser Klassen erweitern.

BlackICE
quelle
4

Bei der Komposition besteht etwas aus verschiedenen Teilen und es besteht eine starke Beziehung zu diesen Teilen. Wenn der Hauptteil stirbt, sterben auch die anderen, sie können kein eigenes Leben führen. Ein grobes Beispiel ist der menschliche Körper. Nehmen Sie das Herz heraus und alle anderen Teile sterben ab.

Bei der Vererbung nehmen Sie einfach etwas, das bereits vorhanden ist, und verwenden es. Es gibt keine starke Beziehung. Ein Mensch könnte den Nachlass seines Vaters erben, aber er kann darauf verzichten.

Ich kenne Java nicht, daher kann ich kein Beispiel angeben, aber ich kann die Konzepte erläutern.

Robert Rocha
quelle
3

Die Vererbung zwischen zwei Klassen, wobei eine Klasse eine andere Klasse erweitert, stellt eine " IS A " -Beziehung her.

Die Komposition am anderen Ende enthält eine Instanz einer anderen Klasse in Ihrer Klasse, die die Beziehung " Hat A " herstellt. Die Komposition in Java ist nützlich, da sie die Mehrfachvererbung technisch erleichtert.

John Wilson
quelle
3

In einfachen Worten bedeutet Aggregation, dass eine Beziehung besteht.

Die Zusammensetzung ist ein Sonderfall der Aggregation . Genauer gesagt wird eine eingeschränkte Aggregation als Zusammensetzung bezeichnet. Wenn ein Objekt das andere Objekt enthält und das enthaltene Objekt ohne das Vorhandensein eines Containerobjekts nicht existieren kann, wird es als Komposition bezeichnet. Beispiel: Eine Klasse enthält Schüler. Ein Schüler kann ohne Klasse nicht existieren. Es gibt eine Komposition zwischen Klasse und Schülern.

Warum Aggregation verwenden?

Wiederverwendbarkeit des Codes

Bei Verwendung der Aggregation

Die Wiederverwendung von Code wird auch am besten durch Aggregation erreicht, wenn kein Beziehungsschiff vorhanden ist

Erbe

Vererbung ist eine Eltern-Kind-Beziehung Vererbung bedeutet, ist eine Beziehung

Die Vererbung in Java ist ein Mechanismus, bei dem ein Objekt alle Eigenschaften und Verhaltensweisen des übergeordneten Objekts erfasst.

Verwenden der Vererbung in Java 1 Code Reusability. 2 Fügen Sie zusätzliche Funktionen in der untergeordneten Klasse sowie das Überschreiben von Methoden hinzu (damit Laufzeitpolymorphismus erzielt werden kann).

Keshav Gera
quelle
1

Obwohl sowohl Vererbung als auch Komposition die Wiederverwendbarkeit von Code bieten, besteht der Hauptunterschied zwischen Komposition und Vererbung in Java darin, dass Komposition die Wiederverwendung von Code ermöglicht, ohne ihn zu erweitern. Für Vererbung müssen Sie die Klasse jedoch für jede Wiederverwendung von Code oder Funktionalität erweitern. Ein weiterer Unterschied, der sich aus dieser Tatsache ergibt, besteht darin, dass Sie mit Composition Code auch für die letzte Klasse wiederverwenden können, die nicht erweiterbar ist, aber Inheritance kann Code in solchen Fällen nicht wiederverwenden. Mit Composition können Sie auch Code aus vielen Klassen wiederverwenden, da diese nur als Mitgliedsvariable deklariert sind. Mit Inheritance können Sie jedoch Code aus nur einer Klasse wiederverwenden, da Sie in Java nur eine Klasse erweitern können, da in Java die Mehrfachvererbung nicht unterstützt wird . Sie können dies jedoch in C ++ tun, da dort eine Klasse mehr als eine Klasse erweitern kann. Übrigens sollten Sie immerlieber Komposition als Vererbung in Java , es ist nicht nur ich, sondern sogar Joshua Bloch hat in seinem Buch vorgeschlagen

Nitin Pawar
quelle
1
Warum sollte ich " Zusammensetzung gegenüber Vererbung bevorzugen "? Sie sind unterschiedliche Konzepte und werden für unterschiedliche Zwecke verwendet. Ehrlich gesagt sehe ich nicht, wie man überhaupt von einem zum anderen gehen könnte.
Kröw
1

Ich denke, dieses Beispiel erklärt deutlich die Unterschiede zwischen Vererbung und Zusammensetzung .

In diesem Beispiel wird das Problem durch Vererbung und Zusammensetzung gelöst. Der Autor achtet darauf, dass; Bei der Vererbung kann eine Änderung der Oberklasse Probleme in der abgeleiteten Klasse verursachen, die sie erbt.

Dort können Sie auch den Unterschied in der Darstellung sehen, wenn Sie eine UML für die Vererbung oder Komposition verwenden.

http://www.javaworld.com/article/2076814/core-java/inheritance-versus-composition--which-one-should-you-choose-.html

aunte
quelle
1
Nur Link-Antworten werden nicht empfohlen, da sie veraltet sind. Bitte geben Sie in Ihrer Antwort mindestens die wichtigsten relevanten Informationen aus dem Link an.
Scott Solmer
1

Vererbungen gegen Zusammensetzung.

Vererbungen und Zusammensetzung werden beide zur Wiederverwendbarkeit und Erweiterung des Klassenverhaltens verwendet.

Vererbungen, die hauptsächlich in einem Familienalgorithmus-Programmiermodell wie dem IS-A-Beziehungstyp verwendet werden, bedeuten eine ähnliche Art von Objekt. Beispiel.

  1. Duster ist ein Auto
  2. Safari ist ein Auto

Diese gehören zur Autofamilie.

Die Zusammensetzung stellt den HAS-A-Beziehungstyp dar. Sie zeigt die Fähigkeit eines Objekts wie Duster mit fünf Gängen, Safari mit vier Gängen usw. Wann immer wir die Fähigkeit einer vorhandenen Klasse erweitern müssen, verwenden Sie die Komposition. Beispiel: Wir müssen dem Duster-Objekt ein weiteres Zahnrad hinzufügen, dann müssen wir ein weiteres Zahnradobjekt erstellen und es zum Duster-Objekt zusammensetzen.

Wir sollten die Änderungen in der Basisklasse erst vornehmen, wenn alle abgeleiteten Klassen diese Funktionalität benötigen. Für dieses Szenario sollten wir Composition verwenden

Klasse A Abgeleitet von Klasse B.

Klasse A abgeleitet von Klasse C.

Klasse A abgeleitet von Klasse D.

Wenn wir eine Funktionalität in Klasse A hinzufügen, steht sie allen Unterklassen zur Verfügung, auch wenn Klasse C und D diese Funktionalität nicht benötigen. Für dieses Szenario müssen wir eine separate Klasse für diese Funktionalität erstellen und sie für die erforderliche Klasse zusammenstellen ( hier ist Klasse B).

Unten ist das Beispiel:

          // This is a base class
                 public abstract class Car
                    {
                       //Define prototype
                       public abstract void color();
                       public void Gear() {
                           Console.WriteLine("Car has a four Gear");
                       }
                    }


           // Here is the use of inheritence
           // This Desire class have four gears.
          //  But we need to add one more gear that is Neutral gear.

          public class Desire : Car
                   {
                       Neutral obj = null;
                       public Desire()
                       {
     // Here we are incorporating neutral gear(It is the use of composition). 
     // Now this class would have five gear. 

                           obj = new Neutral();
                           obj.NeutralGear();
                       }

                       public override void color()
                       {
                           Console.WriteLine("This is a white color car");
                       }

                   }


             // This Safari class have four gears and it is not required the neutral
             //  gear and hence we don't need to compose here.

                   public class Safari :Car{
                       public Safari()
                       { }

                       public override void color()
                       {
                           Console.WriteLine("This is a red color car");
                       }


                   }

   // This class represents the neutral gear and it would be used as a composition.

   public class Neutral {
                      public void NeutralGear() {
                           Console.WriteLine("This is a Neutral Gear");
                       }
                   }
Sheo Dayal Singh
quelle
0

Komposition bedeutet, ein Objekt für eine Klasse zu erstellen, die eine Beziehung zu dieser bestimmten Klasse hat. Angenommen, der Schüler hat eine Beziehung zu den Konten.

Eine Vererbung ist, dass dies die vorherige Klasse mit der erweiterten Funktion ist. Das heißt, diese neue Klasse ist die alte Klasse mit einigen erweiterten Funktionen. Angenommen, Student ist Student, aber alle Studenten sind Menschen. Es besteht also eine Beziehung zwischen Schüler und Mensch. Das ist Vererbung.

HM Nayem
quelle
0

Nein, beide sind unterschiedlich. Die Zusammensetzung folgt der Beziehung "HAS-A" und die Vererbung der Beziehung "IS-A". Bestes Beispiel für die Komposition war das strategische Muster.

Ranga Reddy
quelle
2
Seine einzige Kommentarqualität
Mathews Sunny
Haben Sie gerade dasselbe kommentiert, was die akzeptierte Antwort 7 Jahre vor Ihnen sagte?
Anjil Dhamala
0

Vererbung bedeutet, die gesamte Funktionalität einer Klasse wiederzuverwenden. Hier muss meine Klasse alle Methoden der Superklasse verwenden, und meine Klasse wird mit der Superklasse gekoppelt, und der Code wird im Falle einer Vererbung in beiden Klassen dupliziert.

Aber wir können all diese Probleme überwinden, wenn wir Komposition verwenden, um mit einer anderen Klasse zu sprechen. Komposition deklariert ein Attribut einer anderen Klasse in meiner Klasse, mit der wir sprechen möchten. und welche Funktionalität wir von dieser Klasse wollen, können wir mit diesem Attribut erhalten.

Vikas Kapadiya
quelle