Problém privátních vlastností při dědění v OOP v JavaScriptu

To, že privátní vlastnosti nejsou děděny, může vést k nečekanému problému. Podívejme se na příklad. Předpokládejme, že máme následující rodičovskou třídu s privátní vlastností:

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

Předpokládejme, že v potomní třídě jsme se rozhodli vytvořit metodu, která bude zvyšovat věk o jednu. Avšak, pokus změnit privátní vlastnost rodiče povede k chybě:

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

Chyba zmizí, pokud v potomní třídě deklarujeme privátní vlastnost #age:

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

Tady na nás čeká past! Ve skutečnosti jsme vytvořili dva privátní vlastnosti: jednu v rodiči a jednu v potomkovi. A ty fungují zcela nezávisle. To znamená, že metody rodiče budou měnit svou vlastnost a metody potomka - své.

Tento problém má ve skutečnosti řešení. Stačí manipulovat s privátními vlastnostmi rodiče pomocí metod tohoto rodiče. Přepišme náš kód v souladu s tím:

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

Lze zjednodušit:

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

V následujícím kódu je v potomní třídě předefinován metoda rodiče. Opravte problémy v tomto kódu:

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