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

То што приватна својства не наслеђују, може довести до неочекиваног проблема. Хајде да погледамо на примеру. Нека имамо следећи родитељску класу са приватним својством:

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;
    }
  }
}