"Erweitert" versus "implementiert" versus "mit"

74

Ich möchte den Unterschied zwischen verstehen extends, implementsund with. Wann verwende ich jedes Schlüsselwort?

Keerti Purswani
quelle

Antworten:

75

Erweitert:

Verwenden Sie Erweitert, um eine Unterklasse zu erstellen, und Super, um auf die Oberklasse zu verweisen.

Extendsist die typische Vererbung von OOP- Klassen. Wenn Klasse eine Klasse erweitert b alle Eigenschaften, Variablen in der Klasse implementierten Funktionen b ist auch in der Klasse zur Verfügung ein . Zusätzlich können Sie Funktionen usw. überschreiben.

Sie verwenden, extendwenn Sie eine spezifischere Version einer Klasse erstellen möchten. Zum Beispiel der Klasse Auto könnte die Klasse erweitert Fahrzeug . In Dart kann eine Klasse nur eine Klasse erweitern.


Implementiert:

Jede Klasse definiert implizit eine Schnittstelle, die alle Instanzmitglieder der Klasse und alle von ihr implementierten Schnittstellen enthält. Wenn Sie eine Klasse A erstellen möchten, die die API von Klasse B unterstützt, ohne die Implementierung von B zu erben, sollte Klasse A die B-Schnittstelle implementieren.

Implementskann verwendet werden, wenn Sie eine eigene Implementierung einer anderen Klasse oder Schnittstelle erstellen möchten. Wenn Klasse a Klasse b implementiert . Alle in Klasse b definierten Funktionen müssen implementiert werden.

Wenn Sie eine andere Klasse implementieren, erben Sie keinen Code von der Klasse. Sie erben nur den Typ. In Dart können Sie das implementsSchlüsselwort mit mehreren Klassen oder Schnittstellen verwenden.


Mit (Mixins):

Mixins sind eine Möglichkeit, den Code einer Klasse in mehreren Klassenhierarchien wiederzuverwenden.

Withwird verwendet, um Mixins einzuschließen. Ein Mixin ist eine andere Art von Struktur, die nur mit dem Schlüsselwort verwendet werden kannwith .

Sie werden in Flutter verwendet, um allgemeine Codefragmente einzuschließen. Ein häufig verwendetes Mixin ist das SingleTickerProviderStateMixin .

NiklasPor
quelle
So extendskann nicht für Mehrfachvererbung verwendet werden? Könnten Sie bitte erklären, dass "jede Klasse implizit eine Schnittstelle definiert, die alle Instanzmitglieder der Klasse und alle von ihr implementierten Schnittstellen enthält"? Was passiert, wenn ich SingleTickerProviderStateMixin erweitere? anstatt mit zu verwenden?
Keerti Purswani
9
In anderen Programmiersprachen können Sie keine implementKlassen, sondern nur implementSchnittstellen. Eine Schnittstelle enthält nur Funktions- und Variablendefinitionen, jedoch keine Implementierung. In Dartjeder Klasse gibt es automatisch eine Schnittstelle, die alle Definitionen enthält. Daher können Sie auch implementsmit Klassen verwenden.
NiklasPor
Und ja, extendskann nur mit einer einzigen Klasse verwendet werden.
NiklasPor
5
"Jede Klasse hat automatisch eine Schnittstelle" - wird also die gesamte Implementierung innerhalb einer Klasse ignoriert, wenn ich sie aus einer anderen Klasse implementiere?
Keerti Purswani
@Niklas Was würde passieren, wenn ich ein withSchlüsselwort mit einer Klasse anstelle eines Mixins verwenden würde? Der Compiler beschwert sich NICHT.
Kosiara - Bartosz Kosarzycki
0

extendkann zu der Zeit nur mit einer einzelnen Klasse verwendet werden, ABER ... Sie können leicht eine Klasse erweitern, die eine andere Klasse erweitert, die eine andere Klasse erweitert, die ...! ;)

Tatsächlich sind die meisten Flutter-Widgets bereits so aufgebaut.

Karolina Hagegård
quelle