Проблема приватних својстава при наслеђивању у ООП у 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;
}
}
}