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