Privaatse omaduste pärimise probleem OOP-s JavaScriptis

Asjaolu, et privaatsed omadused ei pärine, võib viia ootamatu probleemini. Vaatame näidet. Olgu meil järgmine vanemaklass privaatse omadusega:

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

Oletame, et lapsklassis otsustasime teha meetodi, mis suurendab vanust ühe võrra. Siiski, katse muuta vanema privaatset omadust viib veani:

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

Viga kaob, kui lapsklassis deklareerida privaatne omadus #age:

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

Siin ootabki meid lõks! Tegelikult loome kaks privaatset omadust: üks vanemas ja üks lapses. Ja need töötavad täiesti sõltumatult. See tähendab, et vanema meetodid muudavad oma omadust ja lapse meetodid - oma omadust.

Sellel probleemil on tegelikult lahendus. Lihtsalt tuleb manipuleerida vanema privaatsete omadustega läbi selle vanema meetodite. Kirjutame oma koodi vastavalt sellele ümber:

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

Saab lihtsustada:

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

Järgmises koodis kirjutatakse lapsklassis üle vanema meetod. Parandage probleemid selles koodis:

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