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 {}
37
demandé sur Pedro Perez 2016-08-08 19:49:59

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 parent
  • implements 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
45
répondu Radim Köhler 2018-06-07 17:15:37

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));
    }
}

(code dans l'aire de jeux)

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;
}

(code dans l'aire de jeux)

en bref, dans la plupart des cas, vous voulez extend une autre classe et pas à implement.

43
répondu Nitzan Tomer 2017-12-07 13:37:09

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

2
répondu andzep 2018-02-07 11:19:34