Problem privatnih svojstava pri nasleđivanju u OOP u JavaScript-u

To što privatna svojstva nisu nasleđena, može dovesti do neočekivanog problema. Hajde da pogledamo na primeru. Neka imamo sledeći roditeljski klasa sa privatnim svojstvom:

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

Neka u izvedenom klasu rešimo da napravimo metod, koji će povećavati godine za jedan. Međutim, pokušaj da se izmeni privatno svojstvo roditelja dovesti će do greške:

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

Greška će nestati, ako u izvedenom klasu deklarišemo privatno svojstvo #age:

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

Tu nas i čeka zamka! U stvari, stvorili smo dva privatna svojstva: jedno u roditelju i jedno u potomku. I ona rade potpuno nezavisno. Ovo znači, da će metodi roditelja menjati svoje svojstvo, a metodi potomka - svoje.

Ovaj problem zapravo ima rešenje. Jednostavno treba manipulisati privatnim svojstvima roditelja preko metoda tog roditelja. Hajde da prepišemo naš kod u skladu sa ovim:

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

Može se pojednostaviti:

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

U sledećem kodu u izvedenom klasu redefiniše se metod roditelja. Ispravite probleme u ovom kodu:

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