JavaScript-də OOP-də miras zamanı private xüsusiyyətlərin problemi
Private xüsusiyyətlərin miras alınmaması, gözlənilməz bir problemə səbəb ola bilər. Nümunəyə baxaq. Tutaq ki, aşağıdakı valideyn sinifimiz və private xüsusiyyətimiz var:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Tutaq ki, törəmə sinifdə biz yaşı bir vahid artıran bir metod etmək qərarına gəldik. Lakin, valideynin private xüsusiyyətini dəyişməyə cəhd xəta ilə nəticələnəcək:
class Student extends User {
incAge() {
this.#age++; // xəta
}
}
Xəta, törəmə sinifdə
private xüsusiyyət #age elan edildikdə
yox olacaq:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Bizi tələyə salan məhz budur! Əslində biz iki private xüsusiyyət yaratdıq: biri valideyndə və biri törəmədə. Və onlar tamamilə müstəqil işləyir. Bu o deməkdir ki, valideyn metodları öz xüsusiyyətlərini dəyişəcək, törəmə metodları isə - öz xüsusiyyətlərini.
Bu problemin həll yolu var. Sadəcə, valideynin private xüsusiyyətləri ilə həmin valideynin metodları vasitəsilə işləmək lazımdır. Gəlin kodumuzu buna uyğun yenidən yazaq:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Sadələşdirmək olar:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Aşağıdakı kodda törəmə sinifdə valideyn metodu yenidən təyin olunur. Bu koddakı problemləri düzəldin:
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;
}
}
}