Մասնավոր հատկությունների ժառանգման խնդիրը OOP-ում 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;
}
}
}