Golang: was ist der Sinn von interfaces, wenn Sie mehrere inheritence
Ich bin ein Java-Programmierer, Programmieren lernen in Go. So weit ich mag die Sprache. VIEL mehr als Java.
Aber es gibt eine Sache, ich bin ein bisschen verwirrt. Java-Schnittstellen, da Klassen nur Erben von einer Klasse. Da Gehen erlaubt multiple Vererbung, was ist der Sinn von interfaces?
- Meiner bescheidenen Meinung nach, die Antwort zu stackoverflow.com/questions/8531292/... gilt auch hier.
- Interfaces und Mehrfachvererbung sind verwandt, aber nur am Rande. Java-Schnittstellen sind kein Ersatz für die Mehrfachvererbung. Schnittstellen ermöglichen es Ihnen, zu gesonderten Vertrag von der Implementierung. Mehrfache Vererbung beschränkt wurde verwendet, verursacht aber mehr Probleme und nicht-intuitives, schwer zu Debuggen Probleme, als es Wert, IMHO.
- könnten Sie das näher erläutern? Schnittstellen nur sagen, 'was' zu tun, in der Erwägung, dass bei der Vererbung erhalten Sie auch Informationen darüber, " wie " es zu tun, mit der option überschreiben das Verhalten. Wie kann Vererbung zu Problemen führen, und in welchen Szenarien würden Schnittstellen überlegen. Ein Beispiel würde wirklich helfen!
- Viel Arbeit wurde investiert, um Problemumgehungen für die das diamond inheritance problem. Java vermeidet diesen gänzlich. Eine vollständige Abhandlung über den Unterschied zwischen interfaces und Vererbung wäre mehr Platz vorhanden ist als auf SO.
- Stimme völlig mit Ihnen auf, dass. Java vermeidet die mehrfache Vererbung, und muss die Schnittstellen, weil die. Go ermöglicht die mehrfache Vererbung, indem Sie Sie überschreiben die widersprüchliche Methoden. Meine Frage war, welchen Zweck die Schnittstellen dienen in diesem Szenario. Stellt sich heraus, es ist duck typing. Ich füge eine Antwort für den gleichen
- Es gibt keine Vererbung in OOP-Sinne im Gehen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Polymorphismus
Schnittstellen ermöglichen die Funktionen haben ein 'Platzhalter' - parameter, können in unterschiedlichen Strukturen als argument. Zum Beispiel, wenn structs Mann, Frau, Kind Schnittstelle implementieren der Mensch, dann die Methode mit dem parameter-Mensch kann jede beliebige der Strukturen, Mann, Frau, Kind als argument. Also die interface-parameter kann mit 'morph' in jede Struktur als argument übergeben, so lange, wie es implementiert alle Funktionen, die im interface definiert sind.
Dies ist wichtig, weil die Schnittstellen sind nur so erreichen Polymorphismus im Gehen, da Sie nicht die Vererbung. Also wenn Mann 'erweitert' Mensch (indem er es als ein anonymes Feld), jede Methode, die verwendet Menschen als argument, nicht in der Lage, nehmen Sie den Menschen als ein argument.
Meine Verwirrung resultierte aus der Tatsache, dass die Vererbung ist auch eine Möglichkeit, dies zu erreichen Polymorphismus in Java, und ich vermutete, dass war der Fall auch hier. Ich stehe korrigiert!
Schnittstellen Gehen, sind sehr Verschieden von Schnittstellen in Java.
In Java eine Klasse hat formell Zustimmen, die eine Schnittstelle implementieren:
Im Gehen ein Benutzer eine Schnittstelle implementiert, indem Sie einfach so tun.
Einer Funktion oder Eigenschaft kann dann definieren, was erwartet wird:
Den
DoSomething
Funktion übergeben werden können alles, die dieRead
Funktion gefunden in derio.Reader
- Schnittstelle, ohne die Sache zu wissen, oder die Sorge um die Schnittstelle. Es liegt in der Verantwortung des Aufrufers, um sicherzustellen, dass es vorbei ist in etwas, die die Schnittstelle implementiert. Dies angekreuzt ist zur compile-Zeit.Können wir noch einen Schritt weiter. Wir definieren unsere eigene-Schnittstelle:
Gehen ist auch anders, dass es nicht eine Klasse oder Objekt geben. Jeder Benutzer deklarierten Typ, ob es ein integer, string, struct, array, Scheibe, Kanal, etc. können Methoden angefügt.
Gehen auch nicht über typische Klasse wie Vererbung, Sie sind normalerweise verwendet, aber es gibt ein paar Dinge, die sind ziemlich nah.
Erneut deklariert Typ:
Anonyme Felder:
Wenn Supertyp X ist eine Schnittstelle, wer ist den code zu verwalten weiß auf einmal, dass es keine methodenimplementierungen. Wenn Supertyp Y ist eine abstrakte Klasse, wer ist den code zu verwalten hat, zu prüfen, ob Implementierungen von Methoden. So ist es eine Dokumentation/Wartung/Lesbarkeit Sache.
Klassen können Erben und implementieren, die aus mehreren class-Dateien.
Wenn ich falsch interpretiert:
Dem Punkt Schnittstellen ist eine vollständig abstrakte Klasse. So Abstrakt, dass es nicht eine einzelne Methode festgelegt.
Ich würde mich über eine Schnittstelle, die, wenn ich Sie brauche, um erstellen Sie mehrere abstrakte Klassen mit der gleichen Grundstruktur. Ich würde dann in der Lage sein zu erstellen, die Instanzen von Klassen, die eine Erweiterung der abstrakten Klasse, die wiederum würde das interface implementieren.
Dies geschieht mit der Schnittstelle
java.util.Collection
und einige Klassen wiejava.util.ArrayList
undjava.util.Stack
implementieren diese Schnittstelle. Auf diese Weise können Sie speichern alle Arten von Listen' Elemente in einer Auflistung. Dies ist der Grund, warumArrayList
hat eine Methode, umaddAll(Collection<? extends E> c)
.Könnte man sagen, es ist wie rückwärts kompatibel mit einfacheren Objekten.