Problema proprietăților private la moștenire în OOP în JavaScript
Faptul că proprietățile private nu sunt moștenite, poate duce la o problemă neașteptată. Să ne uităm la un exemplu. Să presupunem că avem următoarea clasă părinte cu o proprietate privată:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Să presupunem că în clasa derivată am decis să creăm o metodă care va incrementa vârsta cu unu. Însă, încercarea de a modifica proprietatea privată a părintelui va duce la o eroare:
class Student extends User {
incAge() {
this.#age++; // eroare
}
}
Eroarea va dispărea dacă în clasa derivată
declarăm proprietatea privată #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Aici ne așteaptă capcana! De fapt, am creat două proprietăți private: una în părinte și una în derivată. Și ele funcționează complet independent. Aceasta înseamnă că metodele părintelui vor modifica propria lor proprietate, iar metodele derivatei - propriile lor.
Această problemă are de fapt o soluție. Pur și simplu trebuie să manipulăm proprietățile private ale părintelui prin metodele acestui părinte. Să rescriem codul nostru în conformitate cu aceasta:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Putem simplifica:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
În următorul cod în clasa derivată este redefinită metoda părintelui. Corectați problemele din acest cod:
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;
}
}
}