Yksityisominaisuuksien perinnän ongelma OOP:ssa JavaScriptissä

Se, että yksityisominaisuuksia ei periydy, voi johtaa odottamattomaan ongelmaan. Katsotaanpa esimerkkiä. Oletetaan, että meillä on seuraava yläluokka, jossa on yksityinen ominaisuus:

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

Oletetaan, että alaluokassa päätimme tehdä menetelmän, joka kasvattaa ikää yhdellä. Yläluokan yksityisen ominaisuuden muuttamisyritys kuitenkin aiheuttaa virheen:

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

Virhe katoaa, jos alaluokassa esitellään yksityinen ominaisuus #age:

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

Siinä meitä odottaakin ansa! Oikeastaan loimme kaksi yksityistä ominaisuutta: yksi yläluokassa ja yksi alaluokassa. Ja ne toimivat täysin riippumattomasti. Tämä tarkoittaa, että yläluokan menetelmät muuttavat omia ominaisuuksiaan, ja alaluokan menetelmät - omiaan.

Tämä ongelma on oikeastaan ratkaistavissa. Yksityisiä yläluokan ominaisuuksia täytyy vain hallita yläluokan menetelmien kautta. Kirjoitetaan koodimme uudelleen tämän mukaisesti:

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

Voidaan yksinkertaistaa:

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

Seuraavassa koodissa alaluokassa ylikirjoitetaan yläluokan menetelmä. Korjaa tämän koodin ongelmat:

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