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:

javascriptclass 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:

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

Xatolik, agar voris sinfda #age maxsus xususiyatini e'lon qilsak, yo'qoladi:

javascriptclass 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:

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

Soddalashtirish mumkin:

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

Quyidagi kodda voris sinfda ota-sinf metodi qayta belgilanadi. Ushbu koddagi muammolarni tuzating:

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