A privát tulajdonságok öröklődésének problémája az OOP-ben JavaScriptben
Az, hogy a privát tulajdonságok nem öröklődnek, váratlan problémához vezethet. Nézzük ezt egy példán keresztül. Legyen egy szülő osztályunk egy privát tulajdonsággal:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Tegyük fel, hogy a gyermek osztályban el akarunk készíteni egy metódust, amely eggyel növeli a kort. Mindazonáltal, a szülő privát tulajdonságának megváltoztatása hibához vezet:
class Student extends User {
incAge() {
this.#age++; // hiba
}
}
A hiba eltűnik, ha a gyermek osztályban
deklaráljuk a #age privát tulajdonságot:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Itt lesújt ránk a csapda! Valójában két privát tulajdonságot hoztunk létre: egyet a szülőben és egyet a gyermekben. És ezek teljesen függetlenül működnek. Ez azt jelenti, hogy a szülő metódusai a saját tulajdonságukat módosítják, a gyermek metódusai pedig - a sajátjaikat.
Ennek a problémának valójában van megoldása. Egyszerűen a szülő privát tulajdonságaival a szülő metódusain keresztül kell manipulálni. Írjuk át a kódunkat ennek megfelelően:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Le lehet egyszerűsíteni:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
A következő kódban a gyermek osztályban ádefiniálják a szülő metódusát. Javítsa a kód problémáit:
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;
}
}
}