Gibt es eine Möglichkeit zu garantieren, eine Schnittstelle erweitert eine Klasse in Java?
Angenommen ich habe folgende situation:
public abstract class Vehicle {
public void turnOn() { ... }
}
public interface Flier {
public void fly();
}
Gibt es eine Möglichkeit, dass ich kann garantieren, dass jede Klasse, die Flier
muss auch verlängern Vehicle
? Ich will nicht Flier
eine abstrakte Klasse, denn ich möchte in der Lage sein zu mischen und ein paar andere Schnittstellen in einer ähnlichen Weise.
Zum Beispiel:
//I also want to guarantee any class that implements Car must also implement Vehicle
public interface Car {
public void honk();
}
//I want the compiler to either give me an error saying
//MySpecialMachine must extend Vehicle, or implicitly make
//it a subclass of Vehicle. Either way, I want it to be
//impossible to implement Car or Flier without also being
//a subclass of Vehicle.
public class MySpecialMachine implements Car, Flier {
public void honk() { ... }
public void fly() { ... }
}
InformationsquelleAutor der Frage math4tots | 2013-01-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Java-Schnittstellen nicht erweitern Klassen, was Sinn macht, da der Unterricht enthält details zur Implementierung, kann nicht angegeben werden, innerhalb einer Schnittstelle..
Den richtigen Weg, um mit diesem problem umzugehen, ist die Trennung der Schnittstelle von der Implementierung völlig durch drehen
Vehicle
in eine Schnittstelle als gut. DieCar
e.t.c. verlängern kannVehicle
- Schnittstelle zu zwingen den Programmierer zu implementieren die entsprechenden Methoden. Wenn Sie möchten, zu teilen code unter allenVehicle
Instanzen, dann können Sie eine (möglicherweise abstrakte) Klasse, wie ein Elternteil für alle Klassen, die implementiert werden müssen, die Schnittstelle.InformationsquelleAutor der Antwort thkala
Könnte man die Reihenfolge der Klassen und Schnittstellen so:
Diese Weise werden alle Implementierungen von
Flier
sind garantiert zu implementieren, die Protokoll eines Fahrzeugs, nämlichIVehicle
.InformationsquelleAutor der Antwort Codo
Ist es eine seltsame Anforderung, aber Sie können erreichen, so etwas in der Art mit Generika:
InformationsquelleAutor der Antwort user207421
Diese Frage zeigt, dass du noch nicht Begriffen das Wesen der
interface
undclass
. Das vergessen der konkreten Java-syntax right now, alles, was Sie brauchen, zuerst zu verstehen ist, dass: - Schnittstelle ist eine Reihe von Protokoll -, die Umsetzung-Agnostiker. Es macht keinen Sinn, Sie zu lassen eine Schnittstelle erweitern einer Klasse(die die implementation-oriented).Zurück zu Ihrer konkreten Frage, wenn Sie wollen, zu garantieren, dass ein
Flier
ist immer eine Art vonVehicle
ändern Sie einfach die letztere, um eineinterface
lassen und ehemalige erweitert Sie(macht Es Sinn zu verlängern ein Protokoll, aus dem ein anderes Protokoll). Danach können Sie erstellen, die jede Klasse(Abstrakt oder konkret), dieVehicle
oderFlier
.InformationsquelleAutor der Antwort Hui Zheng
Wenn Sie die Kontrolle haben, auf die
Vehicle
Klassen einfach extrahierenVehicle
als Schnittstelle und bieten dann eine Basis-Implementierung.Wenn Sie keine Kontrolle über
Vehicle
Klasse, zum Beispiel, weil es ist Teil eines Frameworks oder einer Drittanbieter-Bibliothek, es ist nicht möglich in Java.Die nächste Sache, die Sie tun können, ist die Verwendung von Generika mehrere Platzhalter-Schreibweise.
Aber Sie können nicht wirklich direkt anwenden zu Wagen, es sei denn, Sie tun etwas wie dieses:
Dem bot ist seltsam und nicht erzwungen, das selbst Methode tatsächlich Rücksendung selbst, es ist nur ein starker Hinweis/Vorschlag.
Würden Sie implementieren eine
Car
wie diese:kann man einen
Car<?>
wie diese:sollten Sie beide gültige syntax.
Was der compiler hier durchsetzen wird, dass das, was Sie angeben, in
Car<WHICH>
als DIE müssen beide verlängernVehicle
und implementierenCar
. Und durch das hinzufügenself()
Sie sagen die Programmierer, dass dieT
Objekt sein soll, das Objekt selbst, so zwingt die wildcard-Instanz der Klasse, wenn er will, um konform mit der Spezifikation.in Java 8 Sie können sogar definieren, die eine default-Implementierung für die Methode selbst.
Ich wünschte auch, es gibt einen besseren Weg, um mit etwas wie dieses.
InformationsquelleAutor der Antwort Daniele Segato
Jetzt:Wann immer Sie möchten zur Umsetzung von "Flieger" müssen Sie erstreckt sich vom Fahrzeug !
(weil einzige Fahrzeug umsetzen können implementMe).
Dies ist schwierig, aber funktioniert Super.
InformationsquelleAutor der Antwort Peter Rader