Le problème des propriétés privées lors de l'héritage en POO en JavaScript
Le fait que les propriétés privées ne soient pas héritées peut mener à un problème inattendu. Regardons un exemple. Supposons que nous ayons la classe parente suivante avec une propriété privée :
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Supposons que dans la classe enfant, nous ayons décidé de créer une méthode qui augmentera l'âge de un. Cependant, la tentative de modifier la propriété privée du parent entraînera une erreur :
class Student extends User {
incAge() {
this.#age++; // erreur
}
}
L'erreur disparaîtra si dans la classe enfant
on déclare la propriété privée #age :
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
C'est là que le piège nous attend ! En réalité, nous avons créé deux propriétés privées : une dans le parent et une dans l'enfant. Et elles fonctionnent complètement indépendamment. Cela signifie que les méthodes du parent modifieront leur propriété, et les méthodes de l'enfant - les leurs.
Ce problème a en réalité une solution. Il suffit de manipuler les propriétés privées du parent via les méthodes de ce parent. Réécrivons notre code en conséquence :
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
On peut simplifier :
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Dans le code suivant, dans la classe enfant, la méthode du parent est redéfinie. Corrigez les problèmes dans ce code :
class User {
#name;
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
class Employee extends User {
setName(name) {
if (name.length > 0) {
this.#name = name;
}
}
}