Frage

Hier ist ein Beispiel mit mehrere Schnittstellenvererbung in Java und es gibt ein Problem.

Beachten Sie, dass ich erkennen, warum ein Problem gibt es, und das ist nicht der Punkt meiner Frage. Die Frage ist, wie Sie diese besondere mehrere Schnittstellenvererbung Mehrdeutigkeit nennen, wenn es einen Namen für sie.

Zum Beispiel in C ++, die Mehrdeutigkeit, die entsteht, wenn Sie mehrere Implementierungsvererbung verwenden und nicht das überschriebene Methode zur Verwendung bestimmen das „Diamant-Problem“ bezeichnet:

http://en.wikipedia.org/wiki/Diamond_problem

Nun noch einmal, ich weiß, das ist nicht das gleiche Problem hier: Das ist nicht der Punkt. Der Punkt ist, dass ein Name hat in diesem früheren Fall geprägt worden.

Und ich würde gerne wissen, ob ein Name für das Problem existiert etwa ich bin zu beschreiben.

Hier ist ein Beispiel für eine andere Art von Mehrfachvererbung, wo eine Schnittstelle erbt von zwei anderen Schnittstellen, die einen inkompatible Methode Rückgabetyp haben:

interface A {
  void a();
  Integer c();
}

interface B {
  void b();
  Long c();
}

interface MI extends A, B {...}

(Hinweis mehrere Schnittstellenvererbung bei der Arbeit mit dem ‚erweitert‘ Schlüsselwort)

Sie können das nicht tun, denn:

  

Typen A und B sind nicht kompatibel; beide   definieren c (), aber in keinem Zusammenhang mit der Rückkehr   Typ

hat einen Namen geprägt worden, um diese Situation zu beschreiben?

War es hilfreich?

Lösung

Ich bin nicht sicher, es ist ein spezifischer Name für sie, oder zumindest scheint es nicht sehr häufig verwendet werden. Es ist „nur“ ein Problem der impliziten Zuordnung von Interface-Methoden zu Klassenmethoden; wenn Sie Überlastungen haben könnten, die nur im Gegenzug Typ unterscheiden, gäbe es auch kein Problem sein. So kommt es zu einer Unterschrift / Überlastung / implizite Methode Mapping Problem nach unten.

In dem „Thinking in Java“ Online-Buch, gibt es nicht einen Namen für sie auch nicht. http://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ310_001. htm

Nur eine Randnotiz, C # ermöglicht explizite Schnittstellenimplementierungen, die Adressen dieses Problem.

Andere Tipps

JLS § 6.4. 4 Die Mitglieder einer Schnittstellen-Typ nennt solche doppelte Superschnitt Mitglieder mehrdeutig , und erfordert ein Fehler bei der Kompilierung. Ich hatte gehofft, für etwas bunt wie das Beaujolais Effect , Heisenbug , et al . Vielleicht Zweier-a-Menge

Ich weiß auch nicht von einem bestimmten Namen für dieses Problem. Immer dann, wenn es arised wurde es in einem Satz mit den Worten Rückgabetyp Inkompatibilität an einem gewissen Punkt beschrieben. Sie könnten nennen es auch die Karte / Set incompatibilty , da dies einer der prominenteren und ärgerliche Beispiele in den Java-Klassenbibliotheken ist. Es macht es unmöglich, die gleiche Klasse implementieren Karte sowie Set oder Sammlung nur haben, weil Karte eine remove (Object) Methode mit einem anderen Rückgabetyp als Sammlung definiert.

public interface Collection<E> extends Iterable<E> {
    boolean remove(Object o);
}
public interface Set<E> extends Collection<E> {
}
public interface Map<K,V> {
    V remove(Object key);
}

Ich würde gerne das ein Mehrfachvererbung Problem zu nennen, weil Schnittstellen nur gut beschreiben, Interface - eine Reihe von Methoden eine implementierende Klasse definieren muß - und nicht jede Implementierung. eine Schnittstelle mit anderen Schnittstellen erstreckt, bedeutet nicht wirklich die Subschnittstelle erbt von dem Superschnitt, sondern vielmehr, dass die Subschnittstelle ist im Wesentlichen eine Verkettung der in den beide definierten Methoden.

Wenn eine dritte Schnittstelle verwendet wird, um die Subschnittstelle zu erweitern und bietet eine gegensätzliche Methode Erklärung, es ist im Wesentlichen des gleichen, als ob Sie gerade die gleichen zwei gegensätzlichen Methoden in der gleichen Schnittstelle zur Verfügung gestellt hatten.

Ich erinnere mich nicht, ob ich jemals für diesen einen beliebigen Namen gesehen haben. In Programmiersprache Java Spezifikation es für diese keinen Namen entweder.

Das Problem, das Sie beschreiben, existiert in .NET sowie Java, hat aber eine einfache Lösung gibt: das .NET Framework ermöglicht eine Klasse eine Schnittstelle Element verwendet einen Teilnehmer mit einem anderen Namen zu implementieren. Obwohl also die Klassenmethoden, die zwei Schnittstellenelemente implementieren, die nur in dem Rückgabetyp unterscheiden sind erforderlich, um unterschiedliche Namen zu haben, das nicht ausschließt, ihre Fähigkeit Schnittstelle Mitglieder mit dem gleichen Namen zu implementieren.

Wenn eine Schnittstelle erbt zwei Schnittstellen mit widersprüchlichen Elementen, eine Klasse, die implementiert die Verbund Schnittstelle die Mitglieder implementieren kann, als ob es die in Konflikt stehenden Schnittstellen geerbt hatte direkt. Verbraucher der kombinierten Schnittstelle werden in der Regel nicht die Mitglieder der beide Komponentenschnittstelle ohne eine Umwandlung des Verweises auf einer der anderen Schnittstellentypen in der Lage zu verwenden, aber die Besetzung in Frage wird ein upcast statt einer gesenkten betrachtet werden.

Das Schema in .NET implementiert funktioniert es gut. Leider gibt es keine Möglichkeit, etwas Ähnliches in Java zu tun. Ich weiß nicht, dass Java kreischen, wenn eine Schnittstelle erbt andere Schnittstellen mit widersprüchlichen Mitgliedern, aber ob es an diesem Punkt kreischt, gäbe es keine Möglichkeit, eine Klasse zu produzieren, die sie umsetzen könnte.

Ich glaube nicht, ein Name definiert wurde, weil Schnittstellen in Java nicht Methodenimplementierung haben können, wird das Problem dadurch vermieden, da immer nur eine Implementierung auf ein spezielles Verfahren ist und daher keine Zweideutigkeit entstehen.

verpasst habe ich den Punkt oder sprechen Sie über die ‚c‘ Variable?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top