251 Stimmen

Unterschied zwischen Vererbung und Komposition

Sind Zusammensetzung und Vererbung dasselbe? Wenn ich das Kompositionsmuster implementieren möchte, wie kann ich das in Java tun?

2 Stimmen

Andere damit zusammenhängende Frage: Gibt es irgendetwas, das durch Komposition nicht erreicht werden kann, was durch Vererbung möglich ist? stackoverflow.com/questions/2238642/

1 Stimmen

2 Stimmen

Dieser Artikel war für mich sehr nützlich und hilfreich: thoughtworks.com/insights/blog/

8voto

Michael Rodrigues Punkte 4967

Komposition ist genau so, wie es sich anhört - Sie erstellen ein Objekt, indem Sie Teile zusammenfügen.

EDITAR der Rest dieser Antwort geht fälschlicherweise von folgender Prämisse aus.
Dies wird durch die Schnittstellen erreicht.
Zum Beispiel mit der Car Beispiel oben,

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

Mit ein paar theoretischen Standardkomponenten können Sie also Ihr Objekt aufbauen. Es ist dann Ihre Aufgabe, auszufüllen, wie ein House seine Bewohner schützt, und wie ein Car schützt seine Insassen.

Bei der Vererbung ist es genau andersherum. Sie beginnen mit einem kompletten (oder halbkompletten) Objekt und ersetzen oder überschreiben die verschiedenen Teile, die Sie ändern möchten.

Zum Beispiel, MotorVehicle kann mit einem Fuelable Methode und Drive Methode. Sie können die Kraftstoffmethode so belassen, wie sie ist, weil es dasselbe ist, ein Motorrad und ein Auto zu betanken, aber Sie können die Methode Drive Methode, weil das Motorrad ganz anders fährt als ein Car .

Bei der Vererbung sind einige Klassen bereits vollständig implementiert, und andere haben Methoden, die Sie überschreiben müssen. Bei der Komposition wird Ihnen nichts vorgegeben. (aber Sie können die Schnittstellen implementieren, indem Sie Methoden in anderen Klassen aufrufen, wenn Sie zufällig etwas herumliegen haben).

Komposition wird als flexibler angesehen, denn wenn man eine Methode wie iUsesFuel hat, kann man irgendwo anders (in einer anderen Klasse, einem anderen Projekt) eine Methode haben, die sich nur um Objekte kümmert, die betankt werden können, unabhängig davon, ob es sich um ein Auto, ein Boot, einen Ofen, einen Grill usw. handelt. Schnittstellen schreiben vor, dass Klassen, die angeben, dass sie die Schnittstelle implementieren, auch tatsächlich die Methoden haben, um die es in der Schnittstelle geht. Ein Beispiel,

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

dann können Sie irgendwo anders eine Methode 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 auffüllt, denn das Objekt implementiert iUsesFuel kann sie gefüllt werden. Ende der Geschichte.

Wenn Sie stattdessen Vererbung verwenden würden, bräuchten Sie verschiedene FillHerUp Methoden zum Umgang mit MotorVehicles y Barbecues Es sei denn, man hätte ein ziemlich seltsames Basisobjekt "ObjectThatUsesFuel", von dem man erben könnte.

0 Stimmen

Die Java-Konventionen besagen, dass die Namen von Klassen und Schnittstellen in ThisCase , nicht in camelCase . Daher ist es am besten, wenn Sie Ihre Schnittstellen so benennen IDrivable , usw. Sie brauchen das "I" möglicherweise nicht, wenn Sie alle Ihre Schnittstellen korrekt in einem Paket zusammenfassen.

7voto

Ravindra babu Punkte 45577

Sind Zusammensetzung und Vererbung dasselbe?

Sie sind nicht gleich.

Zusammensetzung : Sie ermöglicht es, eine Gruppe von Objekten so zu behandeln wie eine einzelne Instanz eines Objekts. Der Zweck eines Composites ist es, Objekte in Baumstrukturen zu "komponieren", um Teil-Ganzes-Hierarchien darstellen

Vererbung : Eine Klasse erbt Felder und Methoden von allen ihren Oberklassen, ob direkt oder indirekt. Eine Unterklasse kann Methoden überschreiben, die sie erbt, oder sie kann Felder oder Methoden ausblenden, die sie erbt.

Wenn ich das Kompositionsmuster implementieren möchte, wie kann ich das in Java tun?

Wikipedia Artikel ist gut genug, um Composite Pattern in Java zu implementieren.

enter image description here

Wichtige Teilnehmer:

Komponente :

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

Blatt :

  1. Repräsentiert Blattobjekte in der Zusammensetzung
  2. Implementiert alle Komponente Methoden

Komposit :

  1. Stellt eine zusammengesetzte Komponente dar (Komponente mit Kindern)
  2. Implementiert Methoden zur Manipulation von Kindern
  3. Implementiert alle Methoden der Komponente, im Allgemeinen durch Delegieren an ihre Kinder

Code-Beispiel zum Verständnis Komposit Muster:

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. Anders Teile des Fahrzeugs wurden zu Car hinzugefügt
  4. Der Preis für Auto \= Summe aus ( Preis jedes Teil )

Zu den Vor- und Nachteilen von Komposition und Vererbung siehe die folgende Frage.

Bevorzugen Sie Komposition statt Vererbung?

0 Stimmen

Macht es Sinn, auch Teile für die Fahrzeugklasse zu implementieren. Wird es nicht gut sein, wenn Sie es als Zusammensetzung verwenden

4voto

BlackICE Punkte 8598

Ein weiteres Beispiel ist eine Autoklasse. Dies wäre eine gute Verwendung der Komposition, denn ein Auto "hat" einen Motor, ein Getriebe, Reifen, Sitze usw. Es würde keine dieser Klassen erweitern.

4voto

Robert Rocha Punkte 9410

Eine Komposition ist etwas, das aus verschiedenen Teilen besteht und eine enge Beziehung zu diesen Teilen hat. Wenn der Hauptteil stirbt, dann sterben auch die anderen Teile, sie können kein Eigenleben haben. Ein grobes Beispiel ist der menschliche Körper. Nimmt man das Herz heraus, sterben alle anderen Teile ab.

Bei der Vererbung wird etwas bereits Vorhandenes einfach übernommen und verwendet. Es gibt keine enge Beziehung. Eine Person könnte den Nachlass ihres Vaters erben, aber sie kann auch darauf verzichten.

Da ich Java nicht kenne, kann ich kein Beispiel geben, aber ich kann die Konzepte erklären.

4voto

Keshav Gera Punkte 9684

In einfachen Worten bedeutet Aggregation Has A Relationship

Komposition ist ein Spezialfall der Aggregation . Genauer gesagt, wird eine eingeschränkte Aggregation als Komposition bezeichnet. Wenn ein Objekt ein anderes Objekt enthält und das enthaltene Objekt nicht ohne die Existenz des Containerobjekts existieren kann, spricht man von Komposition. Beispiel: Eine Klasse enthält Schüler. Ein Schüler kann nicht ohne eine Klasse existieren. Es gibt eine Zusammensetzung zwischen Klasse und Schülern.

Warum die Aggregation?

Wiederverwendbarkeit von Code

Wann wird die Aggregation verwendet?

Die Wiederverwendung von Code lässt sich auch am besten durch Aggregation erreichen, wenn es kein Relationschiff gibt.

Vererbung

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

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

Vererbung in Java verwenden 1 Wiederverwendbarkeit von Code. 2 Hinzufügen zusätzlicher Funktionen in der Kindklasse und in der Methode O

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X