Problem prywatnych właściwości przy dziedziczeniu w OOP w JavaScript
To, że prywatne właściwości nie są dziedziczone, może prowadzić do nieoczekiwanego problemu. Spójrzmy na przykład. Załóżmy, że mamy następującą klasę nadrzędną z prywatną właściwością:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Załóżmy, że w klasie potomnej chcieliśmy stworzyć metodę, która będzie zwiększać wiek o jeden. Jednakże, próba zmiany prywatnej właściwości rodzica zakończy się błędem:
class Student extends User {
incAge() {
this.#age++; // błąd
}
}
Błąd zniknie, jeśli w klasie potomnej
zadeklarujemy prywatną właściwość #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Tutaj właśnie czai się na nas pułapka! W rzeczywistości stworzyliśmy dwie prywatne właściwości: jedną w rodzicu i jedną w potomku. I działają one całkowicie niezależnie. To oznacza, że metody rodzica będą zmieniać swoją właściwość, a metody potomka - swoje.
Ten problem w rzeczywistości ma rozwiązanie. Po prostu należy manipulować prywatnymi właściwościami rodzica poprzez metody tego rodzica. Przepiszmy nasz kod zgodnie z tym:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Można uprościć:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
W następnym kodzie w klasie potomka przesłaniana jest metoda rodzica. Popraw problemy w tym kodzie:
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;
}
}
}