Problém súkromných vlastností pri dedení v OOP v JavaScripte
To, že súkromné vlastnosti nie sú dedené, môže viesť k nečakanému problému. Pozrime sa na príklad. Predpokladajme, že máme nasledujúcu rodičovskú triedu so súkromnou vlastnosťou:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Predpokladajme, že v potomkovej triede sme sa rozhodli vytvoriť metódu, ktorá bude zvyšovať vek o jednu. Avšak, pokus zmeniť súkromnú vlastnosť rodiča povedie k chybe:
class Student extends User {
incAge() {
this.#age++; // chyba
}
}
Chyba zmizne, ak v potomkovej triede
deklarujeme súkromnú vlastnosť #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Tu na nás číha pasca! V skutočnosti sme vytvorili dve súkromné vlastnosti: jednu v rodičovi a jednu v potomkovi. A tieto fungujú úplne nezávisle. To znamená, že metódy rodiča budú meniť svoju vlastnosť a metódy potomka - svoje.
Tento problém má v skutočnosti riešenie. Jednoducho je potrebné manipulovať súkromné vlastnosti rodiča prostredníctvom metód tohto rodiča. Prepíšme náš kód v súlade s týmto:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Môžeme zjednodušiť:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
V nasledujúcom kóde je v potomkovej triede predefinovaná metóda rodiča. Opravte problémy v tomto kóde:
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;
}
}
}