Problém privátních vlastností při dědění v OOP v JavaScriptu
To, že privátní vlastnosti nejsou děděny, může vést k nečekanému problému. Podívejme se na příklad. Předpokládejme, že máme následující rodičovskou třídu s privátní vlastností:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Předpokládejme, že v potomní třídě jsme se rozhodli vytvořit metodu, která bude zvyšovat věk o jednu. Avšak, pokus změnit privátní vlastnost rodiče povede k chybě:
class Student extends User {
incAge() {
this.#age++; // chyba
}
}
Chyba zmizí, pokud v potomní třídě
deklarujeme privátní vlastnost #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Tady na nás čeká past! Ve skutečnosti jsme vytvořili dva privátní vlastnosti: jednu v rodiči a jednu v potomkovi. A ty fungují zcela nezávisle. To znamená, že metody rodiče budou měnit svou vlastnost a metody potomka - své.
Tento problém má ve skutečnosti řešení. Stačí manipulovat s privátními vlastnostmi rodiče pomocí metod tohoto rodiče. Přepišme náš kód v souladu s tím:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Lze zjednodušit:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
V následujícím kódu je v potomní třídě předefinován metoda rodiče. Opravte problémy v tomto kódu:
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;
}
}
}