Problema e vetive private në trashëgiminë në OOP në JavaScript
Fakti që vetitë private nuk trashëgohen, mund të çojë në një problem të papritur. Le të shohim një shembull. Le të themi se kemi klasën prind të mëposhtme me një veti private:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Le të themi se në klasën e fëmijës ne kemi vendosur të bëjmë një metodë që do të rrisë moshën me një. Megjithatë, përpjekja për të ndryshuar vetinë private të prindit do të çojë në gabim:
class Student extends User {
incAge() {
this.#age++; // gabim
}
}
Gabimi do të zhduket nëse në klasën e fëmijës
deklarojmë vetinë private #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Këtu na pret kurtha! Në realitet ne kemi krijuar dy veti private: një në prind dhe një në fëmijë. Dhe ato punojnë plotësisht të pavarura. Kjo do të thotë që metodat e prindit do të ndryshojnë vetinë e tyre, dhe metodat e fëmijës - vetën e tyre.
Ky problem në fakt ka një zgjidhje. Thjesht duhet të manipilohen vetitë private të prindit përmes metodave të atij prindi. Le të rishkruajmë kodin tonë në përputhje me këtë:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Mund të thjeshtohet:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Në kodin vijues në klasën e fëmijës ripërcaktohet metoda e prindit. Korrigjoni problemet në këtë kod:
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;
}
}
}