Privačių savybių paveldėjimo problema OOP JavaScripte

Tai, kad privačios savybės nepaveldimos, gali sukelti netikėtą problemą. Pažiūrėkime pavyzdžiu. Tarkime, kad turime šį tėvinę klasę su privačia savybe:

javascriptclass User {
  #age;
  
  setAge(age) {
    this.#age = age;
  }
  getAge() {
    return this.#age;
  }
}

Tarkime, kad vaikinėje klasėje nusprendėme sukurti metodą, kuris padidins amžių vienetu. Tačiau bandymas pakeisti tėvinę privačią savybę sukels klaidą:

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

Klaida išnyks, jei vaikinėje klasėje deklaruosite privačią savybę #age:

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

Štai čia mūsų ir laukia spastai! Iš tiesų mes sukūrėme dvi privačias savybes: vieną tėvinėje klasėje ir vieną vaikinėje. Ir jos veikia visiškai nepriklausomai. Tai reiškia, kad tėviniai metodai keis savo savybę, o vaikiniai metodai - savo.

Ši problema iš tikrųjų turi sprendimą. Tiesiog reikia manipuliuoti tėvinėmis privačiomis savybėmis per tos tėvinės klasės metodus. Perrašykime mūsų kodą pagal tai:

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

Galima supaprastinti:

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

Toliau pateiktame kode vaikinėje klasėje perrašomas tėvinis metodas. Ištaisykite problemas šiame kode:

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;
    }
  }
}