JavaScript-dä OOP-de miras almadynda hususy aýratynlyklaryň meselesi
Hususy aýratynlyklaryň miras alynmaýandygy, garaşylmadyk problema getirip biler. Geliň, mysal bilen göreli. Bizde aşakdaky atalar klasynyň hususy aýratynlygy bolsun:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Çagalar klasynda ýaşy bir birlik köpeltýän metoddý ýasamak isleýändigimizi düşüneli. Emma, atanyň hususy aýratynlygyny üýtgetmek synanyşygy ýalňyşlyk getirer:
class Student extends User {
incAge() {
this.#age++; // ýalňyşlyk
}
}
Çagalar klasynda
hususy aýratynlyk #age hökmünde nygtalsa,
ýalňyşlyk ýokolar:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Şu ýerde bizi pitnä garşylar! Aslynda biz iki hususy aýratynlyk döretdik: biri atada we biri çagada. We olar doly özara garaşsyz işleýärler. Bu şuny aňladýar, atalaryň usullary atanyň aýratynlygyny üýtgeder, çagalaryň usullary bolsa öz aýratynlyklaryny.
Bu meseläniň çözgüdi bar. Diňe atanyň hususy aýratynlyklaryny şol atanyň usullary arkaly dolandyrmaly. Geliň, kodymyzy şu ýörelgä laýyklykda ýazalyň:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Ýönekeýleşdirip bolýar:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Aşakdaky koda çagalar klasynda atalaryň usuly çalşyrylýar. Bu kodda ýüze çykan meseläni düzediň:
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;
}
}
}