Проблема на приватните својства при наследувањето во ООП во JavaScript

Toа што приватните својства не се наследуваат, може да доведе до неочекуван проблем. Да погледнеме на пример. Нека имаме следниот родителски клас со приватно својство:

javascriptclass User {
  #age;
  
  setAge(age) {
    this.#age = age;
  }
  getAge() {
    return this.#age;
  }
}

Нека во класот-потомок одлучиме да направиме метод, кој ќе го зголемува возраста за еден. Сепак, обидот да се промени приватното својство на родителот ќе доведе до грешка:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // грешка
  }
}

Грешката ќе исчезне, ако во класот-потомок се декларира приватното својство #age:

javascriptclass Student extends User {
  #age;
  
  incAge() {
    this.#age++;
  }
}

Тука нè чека замка! Всушност, создадовме две приватни својства: едно во родителот и едно во потомокот. И тие работат потполно независно. Ова значи дека методите на родителот ќе го менуваат своето својство, а методите на потомокот - своето.

Овој проблем всушност има решение. Едноставно треба да се манипулира со приватните својства на родителот преку методите на тој родител. Да го преработиме нашиот код во согласност со ова:

javascriptclass Student extends User {
  incAge() {
    let age = this.getAge();
    age++;
    this.setAge(age);
  }
}

Може да се поедностави:

javascriptclass Student extends User {
  incAge() {
    this.setAge(++this.getAge());
  }
}
Задание 1

Во следниот код во класата-потомок се преопределува методот на родителот. Исправете ги проблемите во овој код:

javascriptclass User {
  #name;
  
  setName(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

class Employee extends User {
  setName(name) {
    if (name.length > 0) {
      this.#name = name;
    }
  }
}