Ich würde gerne wissen, was Mann und Kind gemeinsam haben und wie sie sich unterscheiden.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
Davejoem
quelle
quelle
Antworten:
Kurzfassung
extends
meint:Die neue Klasse ist ein Kind . Es bringt Vorteile mit der Vererbung. Es hat alle Eigenschaften und Methoden als übergeordnetes Element. Es kann einige davon überschreiben und neue implementieren, aber das übergeordnete Material ist bereits enthalten.
implements
meint:Die neue Klasse kann als dieselbe "Form" behandelt werden , obwohl sie kein Kind ist . Es kann an jede Methode übergeben werden, bei der dies
Person
erforderlich ist, unabhängig davon, ob ein anderes übergeordnetes Element als vorhanden istPerson
Mehr ...
In OOP (Sprachen wie C #, Java) würden wir verwenden
extends
von der Vererbung profitieren (siehe Wiki ). Kleines Zitat:implements
wird mehr für Polymorphismus sein (siehe Wiki ). Kleines Zitat:Wir können also einen wirklich anderen Vererbungsbaum von uns haben
class Man
.aber wenn wir auch erklären, dass wir vorgeben können, ein anderer Typ zu sein -
Person
:.. dann können wir es überall verwenden, wo das
Person
benötigt wird. Wir müssen nur die von Personen erfüllen"interface"
(dh alle öffentlichen Dinge implementieren) .implement
andere Klasse? Das ist wirklich cooles ZeugDas schöne Gesicht von Javascript (einer der Vorteile) ist die integrierte Unterstützung der Enten-Eingabe ( siehe Wiki ). Kleines Zitat:
Wenn also in Javascript zwei verschiedene Objekte ... eine ähnliche Methode haben (z. B.
render()
) , können sie an eine Funktion übergeben werden, die dies erwartet:Um das nicht zu verlieren - wir können in Typescript dasselbe tun - mit mehr typisierter Unterstützung. Und dort ist
hat seine Rolle, wo es Sinn macht
In OOP-Sprachen als
C#
... keine Möglichkeit, das zu tun ...Auch die Dokumentation soll hier helfen:
Also, während
extends
bedeutet - es bekommt alles von seinem Elternteilimplements
In diesem Fall ist es fast so, als würde man eine Schnittstelle implementieren. Untergeordnetes Objekt kann so tun, als wäre es übergeordnet ... aber es wird nicht implementiertquelle
extends
-es bekommt alles von seinem Elternteil", gilt es für private Mitglieder? Zum Beispielclass Person {private name: string} class man extends Person{gender: string;}
hatman
die Eigenschaft Namen?In Typoskript (und einigen anderen OO-Sprachen) haben Sie Klassen und Schnittstellen.
Eine Schnittstelle hat keine Implementierung, es ist nur ein "Vertrag" darüber, welche Mitglieder / Methoden dieser Typ hat.
Beispielsweise:
Instanzen, die diese
Point
Schnittstelle implementieren , müssen zwei Mitglieder vom Typ number:x
undy
und eine Methode haben,distance
die eine anderePoint
Instanz empfängt und a zurückgibtnumber
.Die Schnittstelle implementiert keine davon.
Klassen sind die Implementierungen:
( Code auf dem Spielplatz )
In Ihrem Beispiel behandeln Sie Ihre
Person
Klasse einmal als Klasse, wenn Sie sie erweitern, und einmal als Schnittstelle, wenn Sie sie implementieren.Dein Code:
Hat einen Kompilierungsfehler, der sagt:
Und das liegt daran, dass Schnittstellen nicht implementiert sind.
Wenn Sie also
implement
eine Klasse sind, nehmen Sie nur ihren "Vertrag" ohne die Implementierung, also müssen Sie dies tun:( Code auf dem Spielplatz )
Fazit ist, dass Sie in den meisten Fällen zu einer
extend
anderen Klasse und nicht zuimplement
dieser wollen.quelle
Tolle Antwort von @ nitzan-tomer! Hat mir sehr geholfen ... Ich habe seine Demo ein wenig erweitert mit:
Und wie sie sich in Funktionen verhalten, die einen
IPoint
Typ erwarten .Was ich bisher gelernt und als Faustregel verwendet habe: Wenn Sie Klassen und Methoden verwenden, die generische Typen erwarten, verwenden Sie Schnittstellen als erwartete Typen. Stellen Sie sicher, dass das übergeordnete Element oder die Basisklasse diese Schnittstelle verwendet. Auf diese Weise können Sie alle Unterklassen in diesen verwenden, sofern sie die Schnittstelle implementieren.
Hier die erweiterte Demo
quelle
extends
Konzentrieren Sie sich auf das Erben undimplements
auf Einschränkungen, ob Schnittstellen oder Klassen.quelle
Erweitert VS-Geräte
extends
: Die untergeordnete Klasse (die erweitert wird) erbt alle Eigenschaften und Methoden der erweiterten Klasseimplements
: Die Klasse, die dasimplements
Schlüsselwort verwendet, muss alle Eigenschaften und Methoden der Klasse implementieren, die sie verwendetimplements
Einfacher ausgedrückt:
extends
: Hier erhalten Sie alle diese Methoden / Eigenschaften von der übergeordneten Klasse, sodass Sie dies nicht selbst implementieren müssenimplements
: Hier ist ein Vertrag, dem die Klasse folgen muss. Die Klasse muss mindestens die folgenden Methoden / Eigenschaften implementierenBeispiel:
Im Beispiel können wir beobachten, dass die untergeordnete Klasse alles von Person erbt, während die man-Klasse alles von Person selbst implementieren muss.
Wenn wir etwas aus der man-Klasse entfernen würden, zum Beispiel die walk-Methode, würden wir den folgenden Kompilierungszeitfehler erhalten :
quelle