A privát tulajdonságok öröklődésének problémája az OOP-ben JavaScriptben

Az, hogy a privát tulajdonságok nem öröklődnek, váratlan problémához vezethet. Nézzük ezt egy példán keresztül. Legyen egy szülő osztályunk egy privát tulajdonsággal:

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

Tegyük fel, hogy a gyermek osztályban el akarunk készíteni egy metódust, amely eggyel növeli a kort. Mindazonáltal, a szülő privát tulajdonságának megváltoztatása hibához vezet:

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

A hiba eltűnik, ha a gyermek osztályban deklaráljuk a #age privát tulajdonságot:

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

Itt lesújt ránk a csapda! Valójában két privát tulajdonságot hoztunk létre: egyet a szülőben és egyet a gyermekben. És ezek teljesen függetlenül működnek. Ez azt jelenti, hogy a szülő metódusai a saját tulajdonságukat módosítják, a gyermek metódusai pedig - a sajátjaikat.

Ennek a problémának valójában van megoldása. Egyszerűen a szülő privát tulajdonságaival a szülő metódusain keresztül kell manipulálni. Írjuk át a kódunkat ennek megfelelően:

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

Le lehet egyszerűsíteni:

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

A következő kódban a gyermek osztályban ádefiniálják a szülő metódusát. Javítsa a kód problémáit:

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