Проблема на приватните својства при наследувањето во ООП во JavaScript
Toа што приватните својства не се наследуваат, може да доведе до неочекуван проблем. Да погледнеме на пример. Нека имаме следниот родителски клас со приватно својство:
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;
}
}
}