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ă:

javascriptclass 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:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // eroare
  }
}

Eroarea va dispărea dacă în clasa derivată declarăm proprietatea privată #age:

javascriptclass 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:

javascriptclass Student extends User {
  incAge() {
    let age = this.getAge();
    age++;
    this.setAge(age);
  }
}

Putem simplifica:

javascriptclass Student extends User {
  incAge() {
    this.setAge(++this.getAge());
  }
}
Задание 1

În următorul cod în clasa derivată este redefinită metoda părintelui. Corectați problemele din acest cod:

javascriptclass User {
  #name;
  
  setName(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

class Employee extends User {
  setName(name) {
    if (name.length > 0) {
      this.#name = name;
    }
  }
}