2016-06-05 15 views
1

Basierend auf einigen Stackoverflow Beitrag:Mehrfachvererbung, Schnittstelle vs Zusammensetzung mit in Java

Java nicht Mehrfachvererbung unterstützen.

Es gibt ein paar Abhilfen ich denken kann:

Die erste ist, Zusammensetzung: eine Klasse machen, die diese beiden Tätigkeiten als Felder nimmt.

Die zweite ist die Verwendung von Schnittstellen. // Das ist meine Frage

Ich versuche, eine Klasse erstellt, die AA-Klasse-Methode und BB-Klasse-Methode über die Schnittstelle oder Zusammensetzung haben kann. Ich lese viel über Vererbung und Komposition, aber meine Frage ist Interface vs Komposition (welches ist besser). Wenn ich diese beiden Klassen Methoden in einer einzigen Klasse Preference verwenden möchten,

class AA{ 
    public int id(){ 
     return 0; 
    } 
} 

class BB{ 
    public String name(){ 
     return "0"; 
    } 
} 

Offensichtlich Java nicht Mehrfachvererbung unterstützen, und wir müssen entweder Schnittstelle oder Zusammensetzung verwenden.

Schnittstelle:

Erste Schnittstellen konstruieren, die zu diesen beiden Klassen entspricht:

interface AAInterface{ 
    public int id(); 
} 

interface BBInterface{ 
    public String name(); 
} 

dann eine Vorzugs Klasse konstruieren, die diese beiden Schnittstellen implementiert und erklärt zwei Klassenobjekte innerhalb dieser Klasse:

class Preference implements AAInterface, BBInterface{ 
    AA aa; 
    BB bb; 

    public int id() { 
     return aa.id(); 
    } 

    public String name() { 
     return bb.name(); 
    } 
} 

Zusammensetzung: Konstruieren Sie direkt eine Klasse mit zwei Feldern, die zwei Klassenobjekten entsprechen, um ihre Methoden zu verwenden.

class Preference{ 
    AA aa; 
    BB bb; 

public int id() { 
    return aa.id(); 
    } 

public String name() { 
    return bb.name(); 
    } 
} 

Als Ergebnis in der Präferenzklasse, die von anderen Schnittstelle oder Zusammensetzungsverfahren unter Verwendung der I-ID() Methode verwendet werden kann, und den Namen() Methode, die sich von AA und BB-Klasse-Klasse abgeleitet.

Frage: Warum sollten wir Schnittstelle verwenden, da die Zusammensetzung viel einfacher und besser ist? Gibt es einen Grund, dass wir die Schnittstelle anstelle der Zusammensetzung verwenden sollten? Um es anders auszudrücken, wie man mit einer Java-Schnittstelle zwei Klassenmethoden in einer einzigen Klasse erhält, ist mein Weg der richtige Weg, dies zu tun?

+0

'' 'void someMethod (AAInterface param)' '' <- kann die zusammengesetzte '' 'Preference''' nicht übergeben. –

+0

Sie haben nicht erklärt, was das Endergebnis ist. Wenn Sie beispielsweise eine Präferenz wie eine AA und eine BB behandeln möchten, ist eine Schnittstelle sehr sinnvoll. Wenn Sie das nicht tun müssen, dann tun Sie nicht ... –

+0

Ich möchte diese Methoden in einer einzigen Klasse verwenden, das ist mein Ziel @ JonSkeet – SHE

Antwort

0

Bei Schnittstellen geht es nicht um das Vererben von Verhalten. Bringen Sie Ihre Klasse dazu, eine Schnittstelle zu implementieren, wenn Sie ANDERE wissen lassen wollen, was Ihre Klasse kann, und nicht, IHRE Klasse beizubringen, wie man etwas tut. Wenn eine Bibliothek einige interessante Dinge für ein Objekt mit einer getName()-Methode ausführen kann, können Sie nicht erwarten, dass sie alle Klassen in der Welt kennt, die über diese Methode verfügen, aber Sie können Ihre Klasse dazu bringen, eine Schnittstelle zur Bibliothek zu implementieren weiß (sagen), die diese Methode erzwingt, ist vorhanden.

Aus Ihrer Sicht ändert es Ihre Klasse nicht sehr, und Ihre Objekte unterscheiden sich möglicherweise noch erheblich von anderen Objekten. Aus der Perspektive dieser Bibliothek macht es Ihr Objekt nutzbar.

Um dies näher auszuführen: wenn Sie den Zugriff auf bestimmte Methoden benötigen, die bereits in einer anderen Klasse existieren, das ist genug:

class Preference{ 
    AA aa; 
    BB bb; 

public int id() { 
    return aa.id(); 
    } 

public String name() { 
    return bb.name(); 
    } 
} 

Ihr Objekt wird wissen, wie es Name und ID (oder wird es zu sagen ist? Es ist nicht wirklich der Name deines Gegenstandes schließlich :). Aber Sie können es unter anderem nicht zur Sammlung von AAs, BBs, AAInterfaces oder BBInterfaces hinzufügen. Es ist keiner von ihnen. Es verhält sich einfach wie sie. Abhängig von den Bedürfnissen kann es oder nicht genug sein.

+0

"Schnittstellen sind nicht über Verhalten erben." Die einzige Motivation für Interfaces ist die Vererbung, genauer gesagt die fehlende Multi-Vererbung in Java. Multi-Vererbung und Schnittstellen können als etwas redundant angesehen werden (Multi-Vererbung ist leistungsfähiger, aber Sie benötigen keine Schnittstellen, wenn Sie Multi-Vererbung und abstrakte/virtuelle Methoden verwenden). Und seit dem Aufkommen von Java 8 [können Sie Verhalten von Schnittstellen erben] (https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html). – Turing85

+3

@ Turing85 Ich stimme nicht zu. Die einzige Motivation von Schnittstellen ist es, einen Vertrag von * Verhalten * ohne Umsetzung zu beschreiben. Eine Schnittstelle kann * eine andere Schnittstelle mit mehr Verhalten * erweitern. Das ist Erweiterung, nicht Vererbung, da keine Implementierungslogik vererbt wurde, z. Wie eine 'List' und eine' Set' verhalten sich anders, aber beide verhalten sich * wie * eine 'Collection'. – Andreas

+0

@Andreas Sie können auch einen Vertrag mit einer reinen virtuellen/abstrakten Klasse beschreiben (so wie es in C++ gemacht wird). In Java erfolgt dies normalerweise über eine Schnittstelle, da Sie nicht wissen, ob eine Klasse, die Ihren Vertrag implementiert, bereits die Vererbungsbeziehung verwendet. Was das "inherti behaviour" betrifft: Ich glaube, du hast mich falsch verstanden. Ich bin mir bewusst, was "erweitert" auf Interface-Ebene bedeutet. Mein Kommentar wurde mit Standardmethoden gemacht. – Turing85