J'aimerais savoir ce que l' homme et l' enfant ont en commun et en quoi ils diffèrent.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
typescript
extends
implements
Davejoem
la source
la source
Réponses:
Version courte
extends
veux dire:La nouvelle classe est un enfant . Il tire des avantages de l'héritage. Il a toutes les propriétés, méthodes comme parent. Il peut remplacer certains d'entre eux et en implémenter de nouveaux, mais les éléments parents sont déjà inclus.
implements
veux dire:La nouvelle classe peut être traitée comme la même "forme" , alors qu'elle n'est pas un enfant . Il peut être passé à n'importe quelle méthode où le
Person
est requis, indépendamment du fait d'avoir un parent différent dePerson
Plus ...
En POO (langages comme C #, Java), nous utiliserions
extends
pour profiter de l'héritage (voir wiki ). Petite cite:implements
sera plus pour le polymorphisme (voir wiki ). Petite cite:Ainsi, nous pouvons avoir un arbre d'héritage vraiment différent de notre
class Man
.mais si nous déclarons également que nous pouvons prétendre être d'un type différent -
Person
:.. alors nous pouvons l'utiliser n'importe où, là où cela
Person
est nécessaire. Nous devons juste remplir les conditions des personnes"interface"
(c'est-à-dire mettre en œuvre toutes ses activités publiques) .implement
autre classe? C'est vraiment coolLe joli visage de Javascript (l'un des avantages) est le support intégré de la saisie Duck ( voir wiki ). Petite cite:
Donc, en Javascript, si deux objets différents ... auraient une méthode similaire (par exemple
render()
) ils peuvent être passés à une fonction qui l'attend:Pour ne pas perdre cela - nous pouvons faire de même dans Typescript - avec un support plus typé. Et c'est là que
a son rôle, là où ça a du sens
Dans les langues POO comme
C#
... pas moyen de faire ça ...La documentation devrait également aider ici:
Donc pendant
extends
signifie - il obtient tout de son parentimplements
dans ce cas, c'est presque comme implémenter une interface. L'objet enfant peut prétendre qu'il est parent ... mais il n'obtient aucune implémentationla source
extends
-il obtient tout de son parent", cela s'applique-t-il aux membres privés? Par exemple n'avoir le nom de la propriété?class Person {private name: string} class man extends Person{gender: string;}
man
En typographie (et dans certains autres langages OO), vous avez des classes et des interfaces.
Une interface n'a pas d'implémentation, c'est juste un "contrat" des membres / méthodes de ce type.
Par exemple:
Les instances qui implémentent cette
Point
interface doivent avoir deux membres de type number:x
andy
, et une méthodedistance
qui reçoit une autrePoint
instance et renvoie unnumber
.L'interface n'implémente aucun de ceux-ci.
Les classes sont les implémentations:
( code dans la cour de récréation )
Dans votre exemple, vous traitez votre
Person
classe une fois comme une classe lorsque vous l'étendez et une fois comme une interface lorsque vous l'implémentez.Votre code:
A une erreur de compilation disant:
Et c'est parce que les interfaces manquent d'implémentation.
Donc, si vous avez
implement
une classe, vous ne prenez que son "contrat" sans l'implémentation, vous devrez donc faire ceci:( code dans la cour de récréation )
En fin de compte, dans la plupart des cas, vous voulez une
extend
autre classe et non pas àimplement
elle.la source
Excellente réponse de @ nitzan-tomer! M'a beaucoup aidé ... J'ai prolongé un peu sa démo avec:
Et comment ils se comportent dans les fonctions qui attendent un
IPoint
type.Donc, ce que j'ai appris jusqu'à présent et que j'ai utilisé comme règle empirique: si vous utilisez des classes et des méthodes qui attendent des types génériques, utilisez des interfaces comme types attendus. Et assurez-vous que le parent ou la classe de base utilise cette interface. De cette façon, vous pouvez utiliser toutes les sous-classes de celles-ci dans la mesure où elles implémentent l'interface.
Voici la démo étendue
la source
extends
se concentrer sur l'héritage et seimplements
concentrer sur la contrainte, qu'il s'agisse d'interfaces ou de classes.la source
Étend les outils VS
extends
: La classe enfant (qui est étendue) héritera de toutes les propriétés et méthodes de la classe est étendimplements
: La classe qui utilise leimplements
mot - clé devra implémenter toutes les propriétés et méthodes de la classe qu'elleimplements
En termes plus simples:
extends
: Ici, vous obtenez toutes ces méthodes / propriétés de la classe parente, vous n'avez donc pas à l'implémenter vous-mêmeimplements
: Voici un contrat que la classe doit suivre. La classe doit implémenter au moins les méthodes / propriétés suivantesExemple:
Dans l'exemple, nous pouvons observer que la classe enfant hérite de tout de Person alors que la classe man doit tout implémenter de Person elle-même.
Si nous supprimions quelque chose de la classe man, par exemple la méthode de marche, nous obtiendrions l' erreur de compilation suivante :
la source