პრივატული თვისებების მემკვიდრეობის პრობლემა OOP-ში 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;
    }
  }
}