Was ist Komposition in Bezug auf objektorientiertes Design?

69

Ich höre (und lese auf dieser Seite) viel über "Komposition gegenüber Vererbung bevorzugen".

Aber was ist Zusammensetzung? Ich verstehe die Vererbung aus der Sicht von Person: Säugetier: Tier, aber ich kann die Definition von Kompostion nirgendwo wirklich sehen. Kann mich jemand ausfüllen?

DaveDev
quelle

Antworten:

66

Zusammensetzung bezieht sich auf das Kombinieren einfacher Typen zu komplexeren. In Ihrem Beispiel könnte die Komposition sein:

Animal:
    Skin animalSkin
    Organs animalOrgans


Mammal::Animal: 
    Hair/fur mammalFur
    warm-blooded-based_cirulation_system heartAndStuff

Person::Mammal: 
    string firstName
    string lastName

Wenn Sie vollständig komponieren möchten (und alle Vererbungen loswerden möchten), würde dies folgendermaßen aussehen:

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

Der Vorteil dieses Ansatzes besteht darin, dass die Typen Mammalund Personnicht mit der Schnittstelle ihres vorherigen übergeordneten Elements übereinstimmen müssen. Dies könnte eine gute Sache sein , weil manchmal eine Änderung der übergeordneten Klasse schwerwiegende Auswirkungen auf die Unterklassen haben kann. Sie können weiterhin über ihre privaten Instanzen dieser Klassen auf die Eigenschaften und Verhaltensweisen dieser Klassen zugreifen. Wenn sie diese Verhaltensweisen früherer Oberklassen verfügbar machen möchten, können sie sie einfach in eine öffentliche Methode einschließen.

Ich habe hier einen guten Link mit guten Beispielen gefunden: http://www.artima.com/designtechniques/compoinh.html

FrustratedWithFormsDesigner
quelle
7
So kann ich sagen , dass: „Zusammensetzung ist , wenn ich ein Objekt erstellen Class Ainnen Class B(statt Subklassen Class Bvon Class A).“ ?
Thesummersign
Oh. ok habe w69rdyes später beantwortet. JA, das kann ich sagen.
Thesummersign
44

Zusammensetzung ist einfach die Teile, die das Ganze ausmachen. Ein Auto hat Räder, einen Motor und Sitze. Vererbung ist eine "ist eine" Beziehung. Zusammensetzung ist eine "hat eine" Beziehung.

Zylon Cat
quelle
5
Und Aggregation ist eine ... Beziehung.
Henk Holterman
1
Aggregation kann eine einfache Komposition sein, oder wenn es sich um eine Sammlung ähnlicher Dinge handelt (z. B. Räder eines Autos), kann sie als Sammlung behandelt werden. Ein Auto kann vier einzelne Räder haben, die eindeutig identifiziert sind, oder es kann eine Sammlung von Rädern haben. Das hängt von der Nutzung ab. Wenn Sie eine Auflistungsklasse verwenden, ist die Auflistung selbst eine Aggregation.
Zylonische Katze
22

Es gibt drei Möglichkeiten, einer Klasse Verhalten zu verleihen. Sie können dieses Verhalten in die Klasse schreiben. Sie können von einer Klasse erben, die das gewünschte Verhalten aufweist. oder Sie können eine Klasse mit dem gewünschten Verhalten als Feld oder Elementvariable in Ihre Klasse integrieren. Die letzten beiden stellen Formen der Wiederverwendung von Code dar, und die letzte - Zusammensetzung - wird im Allgemeinen bevorzugt. Es gibt Ihrer Klasse nicht das gewünschte Verhalten - Sie müssen die Methode immer noch auf dem Feld aufrufen -, aber es schränkt Ihr Klassendesign weniger ein und führt dazu, dass Code einfacher zu testen und zu debuggen ist. Vererbung hat ihren Platz, aber Zusammensetzung sollte bevorzugt werden.

Carl Manaster
quelle
17
class Engine
{

}

class Automobile
{

}


class Car extends Automobile // car "is a" automobile //inheritance here
{ 
 Engine engine; // car "has a" engine //composition here

}

Zusammensetzung - Die Funktionalität eines Objekts besteht aus einem Aggregat verschiedener Klassen. In der Praxis bedeutet dies, einen Zeiger auf eine andere Klasse zu halten, auf die die Arbeit verschoben wird.

Vererbung - Die Funktionalität eines Objekts besteht aus seiner eigenen Funktionalität und der Funktionalität seiner übergeordneten Klassen.

Schauen Sie sich das Kreisellipsenproblem an , um herauszufinden, warum Komposition gegenüber Vererbung bevorzugt wird .

Zaki
quelle
5

Ein Beispiel für Komposition ist, wenn Sie eine Instanz einer Klasse in einer anderen Klasse haben, anstatt von dieser zu erben

Diese Seite enthält einen guten Artikel, in dem erklärt wird, warum die Leute "Komposition gegenüber Vererbung bevorzugen", und einige Beispiele dafür, warum.

Iain Ward
quelle
1
Nicht wirklich eine Instanz einer Klasse [C2] innerhalb einer anderen Klasse [C1], sondern eine Instanz einer Klasse innerhalb einer Instanz einer anderen Klasse . Ersteres könnte missverstanden werden, als ob Sie C2 bei der Definition von C1 instanziiert hätten, was nicht üblich sein sollte.
Alois Mahdal
0

Komposition

bedeutet einfach, Instanzvariablen zu verwenden, die auf andere Objekte verweisen.


Betrachten Sie dieses sehr einfache Beispiel, um zu veranschaulichen, wie sich die Vererbung im Vergleich zur Komposition in der Abteilung für die Wiederverwendung von Code verhält:


1- Code über Vererbung

    class Fruit {

    // Return int number of pieces of peel that
    // resulted from the peeling activity.
    public int peel() {

        System.out.println("Peeling is appealing.");
        return 1;
    }
}

class Apple extends Fruit {
}

class Example1 {

    public static void main(String[] args) {

        Apple apple = new Apple();
        int pieces = apple.peel();
    }
}

Wenn Sie das ausführen Example1 application, wird "Peeling ist ansprechend" ausgedruckt, da Apple die Implementierung von Fruit erbt (wiederverwendet) peel(). Wenn Sie jedoch zu einem späteren Zeitpunkt den Rückgabewert von peel()in Peel ändern möchten , wird der Code für gebrochen Example1. Ihre Änderung an Fruit bricht den Code von Example1, obwohl Example1 Apple direkt verwendet und Fruit niemals explizit erwähnt. Weitere Informationen finden Sie unter So würde das aussehen:

class Peel {

    private int peelCount;

    public Peel(int peelCount) {
        this.peelCount = peelCount;
    }

    public int getPeelCount() {

        return peelCount;
    }
    //...
}

class Fruit {

    // Return a Peel object that
    // results from the peeling activity.
    public Peel peel() {

        System.out.println("Peeling is appealing.");
        return new Peel(1);
    }
}

// Apple still compiles and works fine
class Apple extends Fruit {
}

// This old implementation of Example1
// is broken and won't compile.
class Example1 {

    public static void main(String[] args) {

        Apple apple = new Apple();
        int pieces = apple.peel();
    }
}

2- Code über Komposition Die Komposition bietet eine alternative Möglichkeit Apple, die Fruit'sImplementierung von wiederzuverwenden peel(). Anstatt zu erweitern Fruit, Applekann ein Verweis auf eine FruitInstanz gespeichert und eine eigene peel()Methode definiert werden, die einfach peel()die Frucht aufruft . Hier ist der Code:

class Fruit {

    // Return int number of pieces of peel that
    // resulted from the peeling activity.
    public int peel() {

        System.out.println("Peeling is appealing.");
        return 1;
    }
}

class Apple {

    private Fruit fruit = new Fruit();

    public int peel() {
        return fruit.peel();
    }
}

class Example2 {

    public static void main(String[] args) {

        Apple apple = new Apple();
        int pieces = apple.peel();
    }
}

für weitere Informationen ref

Hussam Adil
quelle