Quelle est la différence entre "extend" et "implements" en écriture dactylographiée
je voudrais savoir ce que homme et enfant ont en commun et en quoi ils diffèrent.
class Person {
name: string;
age: number;
}
class child extends Person {}
class man implements Person {}
3 réponses
version courte
extends
signifie:
nouvelle classe est un enfant. Les avantages viennent avec l'héritage. Il a toutes les propriétés, les méthodes comme parent. Il peut en outrepasser certaines et en implémenter de nouvelles, mais le truc parent est déjà inclus.
implements
signifie:
nouvelle classe peut être traité comme sur le même "de la forme" tandis que il n'est pas un enfant. Il pourrait être passé à n'importe quelle méthode où le Person
est nécessaire, même si le parent est différent de Person
Plus de ...
OOP(langages tels que C#, Java) on pourrait utiliser
extends
pour profiter de l'héritage (voir wiki). Petite cite:
... L'héritage dans la plupart des les langages orientés objet basés sur la classe sont un mécanisme dans lequel un objet acquiert toutes les propriétés et tous les comportements de l'objet parent. L'héritage permet aux programmeurs de créer des classes qui sont construits sur des classes existantes ...
implements
sera plus pour le polymorphisme (voir wiki). Petite cite:
... le polymorphisme est la fourniture d'une interface unique aux entités de différents type...
donc, nous pouvons avoir un arbre d'héritage très différent de notre class Man
.
class Man extends Human ...
mais si nous déclarons aussi que nous pouvons prétendre être un type différent -Person
:
class Man extends Human
implements Person ...
.. ensuite, on peut l'utiliser n'importe où, où l' Person
est obligatoire. Nous devons juste accomplir des personnes "interface"
(c'est à dire de mettre en œuvre tous ses publics trucs).
implement
autre classe? C'est vraiment cool trucs
Javascript nice face (l'un des avantages) est la prise en charge intégrée de la Duck-typing ( voir wiki). Petite cite:
"Si ça marche comme un canard et il charlatans comme un canard, il doit etre un canard."
Donc, en Javascript, si deux objets différents... aurait une méthode similaire (e.g. render()
) ils peuvent être transmis à une fonction qui attend c':
function(engine){
engine.render() // any type implementing render() can be passed
}
pour ne pas perdre cela - nous pouvons faire la même chose en dactylographiant - avec plus de support dactylographié. Et c'est là
class implements class
a son rôle, où il fait sens
En programmation orientée objet, langues C#
... pas moyen de le faire...
aussi la documentation devrait aider ici:
Interfaces De L'Extension De Classes
quand un type d'interface étend un type de classe il hérite des membres de la classe mais pas leurs implémentations. C'est comme si l'interface a déclaré tous les membres de la classe sans fournir application. Les Interfaces héritent même le privé et protégé les membres d'une classe de base. Cela signifie que lorsque vous créez une interface qui étend la classe avec des membres privés ou protégés, cette interface le type ne peut être implémentée par la classe ou une sous-classe.
Ceci est utile lorsque vous avez un grande hiérarchie de l'héritage, mais veulent pour spécifier que votre code fonctionne uniquement avec des sous-classes qui ont certaines propriété. Les sous-classes n'ont pas à être liés en plus d'hériter à partir de la classe de base. Par exemple:
class Control { private state: any; } interface SelectableControl extends Control { select(): void; } class Button extends Control { select() { } } class TextBox extends Control { select() { } } class Image extends Control { } class Location { select() { } }
ainsi, Alors que
extends
signifie - il obtient tout de son parentimplements
dans ce cas, c'est presque comme implémenter une interface. Objet enfant peut prétendre qu'il est parent... mais il ne fait pas tout la mise en œuvre
en typographie (et dans d'autres langues OO), vous avez des classes et des interfaces.
une interface n'a pas d'implémentation, c'est juste un "contrat" de ce que les membres/méthodes de ce type ont.
Par exemple:
interface Point {
x: number;
y: number;
distance(other: Point): number;
}
les Instances qui implémentent ceci Point
interface doit avoir deux membres du numéro de type: x
et y
, et une méthode distance
qui reçoit un autre Point
instance et renvoie un number
.
Interface ne pas mettre en œuvre de ceux-ci.
les Classes sont les implémentations:
class PointImplementation implements Point {
public x: number;
public y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
public distance(other: Point): number {
return Math.sqrt(Math.pow(this.x - other.x, 2) + Math.pow(this.y - other.y, 2));
}
}
Dans votre exemple vous traiter votre Person
class une fois comme classe quand vous l'étendez et une fois comme interface quand vous l'implémentez.
Votre code:
class Person {
name: string;
age: number;
}
class Child extends Person {}
class Man implements Person {}
a une erreur de compilation disant:
la classe ' Man 'implémente incorrectement l'interface 'Person'.
Propriété "name" est absent dans le type "Man".
et c'est parce que les interfaces ne sont pas implémentées.
Donc, si vous implement
une classe alors de ne prendre que son "contrat" sans la mise en œuvre, de sorte que vous aurez besoin de faire cela:
class NoErrorMan implements Person {
name: string;
age: number;
}
en bref, dans la plupart des cas, vous voulez extend
une autre classe et pas à implement
.
grande Réponse de @nitzan-tomer! M'a beaucoup aidé... J'ai étendu sa démonstration un peu avec:
IPoint interface;
Point implements IPoint;
Point3D extends Point;
et comment ils se comportent dans les fonctions s'attendant à un type D'IPoint.
alors 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 s'attendent à des types génériques, utilisez des interfaces comme les 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 dans ceux aussi loin qu'ils mettent en œuvre les interface.
Ici étendue de démo