Tatizo la Sifa za Kibinafsi Wakati wa Kurithi katika OOP katika JavaScript

Ukweli kwamba sifa za kibinafsi hazirithiwi, inaweza kusababisha tatizo lisilotarajiwa. Tuangalie kwa mfano. Tuchukulie tuna kitabu kizazi mzazi chenye sifa ya kibinafsi ifuatayo:

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

Tuchukulie katika kitabu kizazi mtoto tuliamua kutengeneza njia, ambayo itaongeza umwa kwa moja. Hata hivyo, jaribio la kubadilisha sifa ya kibinafsi ya mzazi litasababisha kosa:

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

Kosa litatoweka, ikiwa katika kitabu kizazi mtoto utatangaza sifa ya kibinafsi #age:

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

Hapa ndipo tunakabiliwa na mtego! Kweli sisi tulizaa sifa mbili za kibinafsi: moja kwenye mzazi na moja kwenye mtoto. Na zinafanya kazi kikamilifu kwa kujitegemea. Hii inamaanisha, kwamba njia za mzazi zitabadilisha sifa zao, na njia za mtoto - zao.

Tatizo hili kweli lina ufumbuzi. Ni lazima tuwasilishe sifa za kibinafsi za mzazi kupitia njia za mzazi huyo. Tuandike tena msimbo wetu kulingana na hili:

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

Inaweza kurahisishwa:

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

Katika msimbo ufuatao katika kitabu kizazi mtoto njia ya mzazi inafafanuliwa upya. Rekebisha matatizo kwenye msimbo huu:

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