Das Problem privater Eigenschaften bei der Vererbung in OOP in JavaScript
Dass private Eigenschaften nicht vererbt werden, kann zu einem unerwarteten Problem führen. Schauen wir uns ein Beispiel an. Nehmen wir an, wir haben die folgende Elternklasse mit einer privaten Eigenschaft:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Nehmen wir an, wir möchten in der abgeleiteten Klasse eine Methode erstellen, die das Alter um eins erhöht. Der Versuch, die private Eigenschaft des Elternteils zu ändern, führt jedoch zu einem Fehler:
class Student extends User {
incAge() {
this.#age++; // Fehler
}
}
Der Fehler verschwindet, wenn in der abgeleiteten Klasse
die private Eigenschaft #age deklariert wird:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Hier lauert die Falle! Tatsächlich haben wir zwei private Eigenschaften erzeugt: eine im Elternteil und eine in der abgeleiteten Klasse. Und sie arbeiten völlig unabhängig voneinander. Das bedeutet, dass die Methoden des Elternteils ihre Eigenschaft ändern werden und die Methoden der abgeleiteten Klasse - ihre eigene.
Dieses Problem hat tatsächlich eine Lösung. Man muss die privaten Eigenschaften des Elternteils einfach über die Methoden dieses Elternteils manipulieren. Schreiben wir unseren Code entsprechend um:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Man kann vereinfachen:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Im folgenden Code wird in der abgeleiteten Klasse die Methode des Elternteils überschrieben. Korrigieren Sie die Probleme in diesem 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;
}
}
}