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.
Comparaison point par point
#Fonctionne entre
- extends (interfaces)
- Deux classes (ou deux interfaces)
- implements
- Une classe et une interface
Hérite du code (champs, méthodes)
- implements
- Non, seulement la forme à implémenter
Nombre à la fois
- extends (interfaces)
- Une seule classe de base
- implements
- Plusieurs interfaces à la fois
Accès à super()
- implements
- Non applicable
Méthode manquante
- extends (interfaces)
- Héritée de la classe de base
- implements
- Erreur :
incorrectly implements interface
Usage typique
- extends (interfaces)
- Logique commune dans des classes dérivées
- implements
- Contrat pour des classes indépendantes
Exemple
#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())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
#class Child extends Base { … }
class MyClass implements MyInterface { … }Plus d’exemples
#class Shape {
describe(): string {
return 'Figure'
}
}
class Circle extends Shape {}
const circle = new Circle()
console.log(circle.describe())
console.log(circle instanceof Shape)Figure true
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.
implementsne 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
extendssont 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
#- extends (interfaces)Étendre une interface avec de nouveaux champs, à partir d’une interface existante.
- implementsUne déclaration indiquant qu’une classe respecte le contrat décrit par une interface.
- abstract classUne classe de base que vous ne pouvez pas créer directement, avec des méthodes à compléter par ses descendants.
- public, private, protectedDes modificateurs d’accès qui déterminent d’où les champs et méthodes d’une classe peuvent être utilisés.
- interfaceUne description nommée de la forme d’un objet, que vous pouvez étendre et fusionner.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.