Chciałbym wiedzieć, co łączy mężczyznę i dziecko i czym się różnią.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
davejoem
źródło
źródło
Odpowiedzi:
Krótka wersja
extends
znaczy:Nowa klasa jest dzieckiem . Otrzymuje korzyści wynikające z dziedziczenia. Ma wszystkie właściwości, metody jako jego rodzic. Może zastąpić niektóre z nich i zaimplementować nowe, ale elementy nadrzędne są już uwzględnione.
implements
znaczy:Nowej klasy mogą być traktowane jako ten sam „kształtu” , a to nie jest dziecko . Można go przekazać do dowolnej metody, w której
Person
jest wymagana, niezależnie od tego, czy ma innego rodzica niżPerson
Więcej ...
W OOP (języki takie jak C #, Java) używalibyśmy
extends
czerpać korzyści z dziedziczenia (patrz wiki ). Mały cytat:implements
będzie bardziej dla polimorfizmu (patrz wiki ). Mały cytat:Więc możemy mieć naprawdę inne drzewo dziedziczenia
class Man
.ale jeśli również zadeklarujemy, że możemy udawać innego typu -
Person
:.. wtedy możemy go używać wszędzie tam, gdzie
Person
jest to wymagane. Musimy tylko spełnić Persons"interface"
(tj. Wdrożyć wszystkie jej publiczne rzeczy) .implement
inna klasa? To naprawdę fajna rzeczMiła twarz Javascript (jedną z zalet) to wbudowana obsługa pisania typu Duck ( zobacz wiki ). Mały cytat:
Tak więc, w Javascript, jeśli dwa różne obiekty ... miałyby jedną podobną metodę (np.
render()
) , Można je przekazać do funkcji, która tego oczekuje:Aby tego nie stracić - możemy zrobić to samo w Typescript - z większą obsługą pisania. I to jest gdzie
ma swoją rolę tam, gdzie ma to sens
W językach OOP jako
C#
... nie da się tego zrobić ...Również dokumentacja powinna tutaj pomóc:
Więc gdy
extends
oznacza - dostaje wszystko od swojego rodzicaimplements
w tym przypadku jest to prawie jak implementacja interfejsu. Obiekt potomny może udawać, że jest rodzicem ... ale nie otrzymuje żadnej implementacjiźródło
extends
-dostaje wszystko od swojego rodzica”, czy dotyczy to prywatnych członków? Na przykładclass Person {private name: string} class man extends Person{gender: string;}
czyman
ma nazwę nieruchomości?W maszynopisie (i niektórych innych językach obiektowych) masz klasy i interfejsy.
Interfejs nie ma implementacji, jest po prostu „kontraktem” elementów członkowskich / metody tego typu.
Na przykład:
Instancje, które implementują ten
Point
interfejs, muszą mieć dwa elementy członkowskie typu numer:x
iy
oraz jedną metodę,distance
która odbiera innePoint
wystąpienie i zwraca pliknumber
.Interfejs nie implementuje żadnego z nich.
Zajęcia to implementacje:
( kod na placu zabaw )
W twoim przykładzie traktujesz swoją
Person
klasę raz jako klasę, kiedy ją rozszerzasz, a raz jako interfejs, kiedy ją implementujesz.Twój kod:
Występuje błąd kompilacji mówiący:
A to dlatego, że interfejsy nie są implementowane.
Więc jeśli jesteś
implement
klasą, bierzesz tylko jej „kontrakt” bez implementacji, więc musisz zrobić to:( kod na placu zabaw )
Najważniejsze jest to, że w większości przypadków chcesz iść do
extend
innej klasy, a nie doimplement
niej.źródło
Świetna odpowiedź od @ nitzan-tomer! Bardzo mi pomogło ... Rozszerzyłem nieco jego demo o:
I jak zachowują się w funkcjach oczekujących
IPoint
typu.Więc czego się do tej pory nauczyłem i używam jako reguły kciuka: jeśli używasz klas i metod oczekujących typów ogólnych, używaj interfejsów jako oczekiwanych typów. I upewnij się, że klasa nadrzędna lub klasa bazowa używa tego interfejsu. W ten sposób możesz użyć wszystkich podklas w tych, o ile implementują interfejs.
Tutaj rozszerzone demo
źródło
extends
skoncentruj się na dziedziczeniu iimplements
skup się na ograniczeniach, czy to interfejsach, czy klasach.źródło
Rozszerza narzędzia VS.
extends
: Klasa potomna (która jest rozszerzona) odziedziczy wszystkie właściwości i metody klasy jest extendsimplements
: Klasa, która używaimplements
słowa kluczowego, będzie musiała zaimplementować wszystkie właściwości i metody klasy, w której jest używaneimplements
Mówiąc prościej:
extends
: Tutaj otrzymujesz wszystkie te metody / właściwości z klasy nadrzędnej, więc nie musisz ich implementować samodzielnieimplements
: Oto kontrakt, którego klasa musi przestrzegać. Klasa musi implementować co najmniej następujące metody / właściwościPrzykład:
W tym przykładzie możemy zauważyć, że klasa potomna dziedziczy wszystko po Person, podczas gdy klasa man musi zaimplementować wszystko od samej Osoby.
Gdybyśmy usunęli coś z klasy man, na przykład metodę walk, otrzymalibyśmy następujący błąd czasu kompilacji :
źródło