ComparaisonComparaisons

extends vs implements

extends hérite des champs et du code d’une classe de base, tandis que implements exige seulement les méthodes et les champs de l’interface, sans en reprendre le code.

Sur cette page

Comparaison point par point

#

Exemple

#
TypeScript
class Person {
  constructor(public name: string) {}

  greet(): string {
    return `Salut, je suis ${this.name}`
  }
}

interface Scorable {
  score(): number
}

class Student extends Person implements Scorable {
  constructor(name: string, private points: number) {
    super(name)
  }

  score(): number {
    return this.points
  }
}

const student = new Student('Léa', 92)
console.log(student.greet())
console.log(student.score())
Résultat
Salut, je suis Léa
92

Définition et utilisation

#

Vous utilisez les deux mots dans la déclaration d’une classe pour la relier à un autre type, et les deux sont vérifiés par le compilateur : si la classe ne remplit pas les exigences, il signale une erreur. Une classe ne peut étendre qu’une seule classe de base, mais elle peut implémenter plusieurs interfaces à la fois.

La différence porte sur ce que reçoit la classe. extends entre classes hérite d’un vrai code : les champs, les méthodes et le constructeur de la classe de base, que vous pouvez appeler via super() ou redéfinir. implements n’hérite d’aucun code, il vérifie seulement à la compilation que la classe a elle-même implémenté tout ce que promet l’interface. extends fonctionne aussi entre interfaces, où il étend la liste des champs requis.

Quand des classes doivent partager une logique commune, par ex. un constructeur commun ou une méthode utilitaire, utilisez extends. Quand vous voulez seulement garantir que des classes différentes et indépendantes ont certaines méthodes, par ex. Comparable ou Serializable, utilisez implements. Les interfaces qui décrivent des capacités se combinent mieux qu’une hiérarchie profonde de classes.

Syntaxe

#
Syntaxe
class Child extends Base { … }
class MyClass implements MyInterface { … }

Plus d’exemples

#
extends hérite du code, implements non
TypeScript
class Shape {
  describe(): string {
    return 'Figure'
  }
}

class Circle extends Shape {}

const circle = new Circle()
console.log(circle.describe())
console.log(circle instanceof Shape)
Résultat
Figure
true
implements exige une implémentation propre
TypeScript
interface Scorable {
  score(): number
}

class Exam implements Scorable {}
// Erreur : Class 'Exam' incorrectly implements interface 'Scorable'.
//   Property 'score' is missing in type 'Exam' but required in type 'Scorable'.

Bonnes pratiques

#
  • Une classe peut implémenter plusieurs interfaces, mais étendre une seule classe. Si vous avez besoin de plusieurs « capacités » indépendantes, utilisez des interfaces.
  • implements ne vérifie que les types. Vous devez de toute façon typer les paramètres des méthodes dans la classe elle-même, le compilateur ne les reprend pas de l’interface.
  • Les longues chaînes extends sont difficiles à maintenir. La composition est souvent meilleure : une classe reçoit un autre objet comme dépendance, au lieu d’en hériter.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.