JavaScript да ООП да мерос хисобланида хусусий хусусиятлар муаммоси

Хусусий хусусиятлар мерос олинмаслиги кутмаган муаммога олиб келиши мумкин. Келгила, мисолда кўрамиз. Фарз қилайлик, бизда куйидаги ота-синф ва унинг хусусий хусусияти бор:

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

Фарз қилайлик, бола-синфда биз ёшни биттага оширадиган метод ясамоқчимиз. Аммо, ота-синфнинг хусусий хусусиятини ўзгартиришга уриниш хатоликка олиб келади:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // хатолик
  }
}

Хатолик бола-синфда хусусий хусусият #ageни эълон қилинса йўқолади:

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

Ана ўша ерда силкиниш кутиб туради! Аслида биз иккита хусусий хусусият ясадок: бири ота-синфда ва иккинчиси бола-синфда. Ва улар ишлайди умумиян мустақил. Бу демакдики, ота-синф методлари ўзгартиради ўз хусусиятларини, ва бола-синф методлари - ўзлариники.

Бу муаммо аслида ечимга эга. Оддийгина хусусий хусусиятлар билан ишлаш керак ота-синфнинг хусусий хусусиятларини шу ота-синфнинг методлари орқали. Келгила, бизнинг кодни қайдонайлик шунингга мувофик:

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

Соддалаштириш мумкин:

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

Куйидаги кодда бола-синфда ота-синфнинг метожи қайта аникланган. Ушбу коддаги муаммоларни тузатинг:

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