Problem prywatnych właściwości przy dziedziczeniu w OOP w JavaScript

To, że prywatne właściwości nie są dziedziczone, może prowadzić do nieoczekiwanego problemu. Spójrzmy na przykład. Załóżmy, że mamy następującą klasę nadrzędną z prywatną właściwością:

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

Załóżmy, że w klasie potomnej chcieliśmy stworzyć metodę, która będzie zwiększać wiek o jeden. Jednakże, próba zmiany prywatnej właściwości rodzica zakończy się błędem:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // błąd
  }
}

Błąd zniknie, jeśli w klasie potomnej zadeklarujemy prywatną właściwość #age:

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

Tutaj właśnie czai się na nas pułapka! W rzeczywistości stworzyliśmy dwie prywatne właściwości: jedną w rodzicu i jedną w potomku. I działają one całkowicie niezależnie. To oznacza, że metody rodzica będą zmieniać swoją właściwość, a metody potomka - swoje.

Ten problem w rzeczywistości ma rozwiązanie. Po prostu należy manipulować prywatnymi właściwościami rodzica poprzez metody tego rodzica. Przepiszmy nasz kod zgodnie z tym:

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

Można uprościć:

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

W następnym kodzie w klasie potomka przesłaniana jest metoda rodzica. Popraw problemy w tym kodzie:

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