Privāto īpašību problēma mantojumā OOP JavaScript

Tas, ka privātās īpašības nemantojas, var izraisīt negaidītu problēmu. Apskatīsim piemērā. Pieņemsim, ka mums ir šāds vecāku klase ar privātu īpašību:

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

Pieņemsim, ka bērna klasē mēs nolēmām izveidot metodi, kas palielinās vecumu par vienu. Tomēr mēģinājums mainīt vecāka privāto īpašību izraisīs kļūdu:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // kļūda
  }
}

Kļūda pazudīs, ja bērna klasē deklarēsiet privāto īpašību #age:

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

Šeit mūs sagaida lamatas! Patiesībā mēs esam radījuši divas privātās īpašības: vienu vecākā un vienu bērna klasē. Un tās darbojas pilnīgi neatkarīgi. Tas nozīmē, ka vecāka metodes mainīs savu īpašību, un bērna metodes - savu.

Šai problēmai patiesībā ir risinājums. Vienkārši privātās īpašības ir jāmaina caur šī vecāka metodēm. Pārrakstīsim mūsu kodu saskaņā ar to:

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

Var vienkāršot:

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

Zemāk esošajā kodā bērna klasē tiek pārdefinēta vecāka metode. Izlabojiet problēmas šajā kodā:

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