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