JavaScript да ООП да мерос хисобланида хусусий хусусиятлар муаммоси
Хусусий хусусиятлар мерос олинмаслиги кутмаган муаммога олиб келиши мумкин. Келгила, мисолда кўрамиз. Фарз қилайлик, бизда куйидаги ота-синф ва унинг хусусий хусусияти бор:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Фарз қилайлик, бола-синфда биз ёшни биттага оширадиган метод ясамоқчимиз. Аммо, ота-синфнинг хусусий хусусиятини ўзгартиришга уриниш хатоликка олиб келади:
class Student extends User {
incAge() {
this.#age++; // хатолик
}
}
Хатолик бола-синфда
хусусий хусусият #ageни эълон қилинса йўқолади:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Ана ўша ерда силкиниш кутиб туради! Аслида биз иккита хусусий хусусият ясадок: бири ота-синфда ва иккинчиси бола-синфда. Ва улар ишлайди умумиян мустақил. Бу демакдики, ота-синф методлари ўзгартиради ўз хусусиятларини, ва бола-синф методлари - ўзлариники.
Бу муаммо аслида ечимга эга. Оддийгина хусусий хусусиятлар билан ишлаш керак ота-синфнинг хусусий хусусиятларини шу ота-синфнинг методлари орқали. Келгила, бизнинг кодни қайдонайлик шунингга мувофик:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Соддалаштириш мумкин:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Куйидаги кодда бола-синфда ота-синфнинг метожи қайта аникланган. Ушбу коддаги муаммоларни тузатинг:
class User {
#name;
setName(name) {
this.#name = name;
}
getName() {
return this.#name;
}
}
class Employee extends User {
setName(name) {
if (name.length > 0) {
this.#name = name;
}
}
}