Մասնավոր հատկությունների ժառանգման խնդիրը 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;
    }
  }
}