TypeScript - Héritage
Bonjour, futurs programmeurs ! Aujourd'hui, nous allons entreprendre un voyage passionnant à travers le monde de l'héritage en TypeScript. En tant que votre professeur d'informatique de quartier, je suis là pour vous guider à travers ce sujet fascinant. Alors, prenez vos sacs à dos virtuels, et plongons dedans !
Qu'est-ce que l'Héritage ?
Avant de commencer, comprenons ce que signifie réellement l'héritage. Imaginez que vous créez un arbre généalogique. Chaque nouvelle génération hérite de certains traits de leurs parents. En programmation, l'héritage fonctionne de manière similaire. Il permet à une nouvelle classe d'être basée sur une classe existante, héritant de ses propriétés et méthodes. Génial, non ?
Héritage Simple
Commençons par la forme la plus simple d'héritage : l'héritage simple. C'est lorsque une classe (classe enfant) hérite d'une autre classe (classe parent).
Exemple de Base
class Animal {
name: string;
constructor(name: string) {
this.name = name;
}
makeSound(): void {
console.log("Un son d'animal générique");
}
}
class Dog extends Animal {
breed: string;
constructor(name: string, breed: string) {
super(name);
this.breed = breed;
}
makeSound(): void {
console.log("Wouf ! Wouf !");
}
}
let myDog = new Dog("Buddy", "Golden Retriever");
console.log(myDog.name); // Output: Buddy
console.log(myDog.breed); // Output: Golden Retriever
myDog.makeSound(); // Output: Wouf ! Wouf !
Dans cet exemple, Dog
hérite de Animal
. Le mot-clé extends
est utilisé pour créer une classe qui est l'enfant d'une autre classe.
Explication
- Nous définissons une classe de base
Animal
avec une propriéténame
et une méthodemakeSound
. - Ensuite, nous créons une classe
Dog
qui étendAnimal
. - La classe
Dog
a sa propre propriétébreed
. - Nous utilisons le mot-clé
super
dans le constructeurDog
pour appeler le constructeurAnimal
. - Nous surchargeons la méthode
makeSound
dans la classeDog
.
Mot-clé Super
Vous avez peut-être remarqué le mot-clé super
dans notre exemple précédent. Plongeons plus profondément dans ce qu'il fait.
Exemple avec Super
class Vehicle {
make: string;
model: string;
constructor(make: string, model: string) {
this.make = make;
this.model = model;
}
getInfo(): string {
return `${this.make} ${this.model}`;
}
}
class Car extends Vehicle {
numDoors: number;
constructor(make: string, model: string, numDoors: number) {
super(make, model);
this.numDoors = numDoors;
}
getInfo(): string {
return `${super.getInfo()} avec ${this.numDoors} portes`;
}
}
let myCar = new Car("Toyota", "Corolla", 4);
console.log(myCar.getInfo()); // Output: Toyota Corolla avec 4 portes
Explication
- Le mot-clé
super
est utilisé dans le constructeurCar
pour appeler le constructeurVehicle
. - Dans la méthode
getInfo
deCar
, nous utilisonssuper.getInfo()
pour appeler la méthodegetInfo
de la classe parent.
Le mot-clé super
nous permet d'accéder et d'appeler des fonctions sur l'objet parent.
Surcharge de Méthode
La surcharge de méthode se produit lorsque une classe enfant fournit une implémentation spécifique d'une méthode déjà définie dans sa classe parent. Nous avons en fait vu cela dans nos deux exemples précédents !
Un Autre Exemple de Surcharge de Méthode
class Shape {
getArea(): number {
return 0;
}
}
class Circle extends Shape {
radius: number;
constructor(radius: number) {
super();
this.radius = radius;
}
getArea(): number {
return Math.PI * this.radius * this.radius;
}
}
class Rectangle extends Shape {
width: number;
height: number;
constructor(width: number, height: number) {
super();
this.width = width;
this.height = height;
}
getArea(): number {
return this.width * this.height;
}
}
let myCircle = new Circle(5);
console.log(myCircle.getArea()); // Output: 78.53981633974483
let myRectangle = new Rectangle(4, 5);
console.log(myRectangle.getArea()); // Output: 20
Explication
- Nous avons une classe de base
Shape
avec une méthodegetArea
qui renvoie 0. - Les classes
Circle
etRectangle
étendentShape
et surchargent la méthodegetArea
avec leurs propres implémentations. - La classe
Circle
calcule l'aire en utilisant la formule πr². - La classe
Rectangle
calcule l'aire en multipliant la largeur et la hauteur.
Héritage Multiniveau
L'héritage multiniveau implique qu'une classe enfant hérite d'une autre classe enfant. C'est comme un arbre généalogique avec plusieurs générations.
Exemple d'Héritage Multiniveau
class Grandparent {
surname: string;
constructor(surname: string) {
this.surname = surname;
}
getSurname(): string {
return this.surname;
}
}
class Parent extends Grandparent {
firstName: string;
constructor(firstName: string, surname: string) {
super(surname);
this.firstName = firstName;
}
getFullName(): string {
return `${this.firstName} ${this.getSurname()}`;
}
}
class Child extends Parent {
middleName: string;
constructor(firstName: string, middleName: string, surname: string) {
super(firstName, surname);
this.middleName = middleName;
}
getFullName(): string {
return `${this.firstName} ${this.middleName} ${this.getSurname()}`;
}
}
let myChild = new Child("John", "Doe", "Smith");
console.log(myChild.getFullName()); // Output: John Doe Smith
Explication
- Nous avons une classe
Grandparent
avec une propriétésurname
. - La classe
Parent
étendGrandparent
et ajoute une propriétéfirstName
. - La classe
Child
étendParent
et ajoute une propriétémiddleName
. - Chaque classe a sa propre implémentation de la méthode
getFullName
.
Résumé des Méthodes d'Héritage
Voici un tableau résumant les méthodes et mots-clés clés que nous avons discutés :
Méthode/Mot-clé | Description |
---|---|
extends |
Utilisé pour créer une classe en tant qu'enfant d'une autre classe |
super() |
Appelle le constructeur de la classe parent |
super.method() |
Appelle une méthode de la classe parent |
Surcharge de Méthode | Fournir une nouvelle implémentation pour une méthode dans une classe enfant |
Et voilà ! Nous avons couvert les bases de l'héritage en TypeScript. Souvenez-vous, la pratique rend parfait, donc n'hésitez pas à expérimenter avec ces concepts. Bonne programmation, futurs magiciens TypeScript !
Credits: Image by storyset