JavaScript-da OOPda Maxsus Xususiyatlarni Meros Qilib Olish Muammosi
Maxsus xususiyatlarning meros qilinmasligi kutilmagan muammolarga olib kelishi mumkin. Keling, buni misolda ko'rib chiqaylik. Faraz qilaylik, bizda quyidagi ota-sinf maxsus xususiyatga ega:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Faraz qilaylik, voris sinfda biz yoshni bittaga oshiradigan metod yaratmoqchimiz. Biroq, ota-sinfning maxsus xususiyatini o'zgartirishga urinish xatolikka olib keladi:
class Student extends User {
incAge() {
this.#age++; // xatolik
}
}
Xatolik, agar voris sinfda
#age maxsus xususiyatini
e'lon qilsak, yo'qoladi:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Mana bizni kutayotgan tuzoq! Aslida biz ikkita maxsus xususiyat yaratdik: biri ota-sinfda, ikkinchisi voris sinfda. Va ular butunlay mustaqil ishlaydi. Bu shuni anglatadiki, ota-sinf metodlari o'z xususiyatini, voris sinf metodlari esa o'zini o'zgartiradi.
Bu muammo aslida yechimga ega. Shunchaki ota-sinfning maxsus xususiyatlari bilan o'sha ota-sinfning metodlari orqali ishlash kerak. Keling, kodimizni qayta yozamiz shunga muvofiq:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Soddalashtirish mumkin:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Quyidagi kodda voris sinfda ota-sinf metodi qayta belgilanadi. Ushbu koddagi muammolarni tuzating:
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;
}
}
}