Проблемът с частните свойства при наследяване в ООП в 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;
}
}
}