Yksityisominaisuuksien perinnän ongelma OOP:ssa JavaScriptissä
Se, että yksityisominaisuuksia ei periydy, voi johtaa odottamattomaan ongelmaan. Katsotaanpa esimerkkiä. Oletetaan, että meillä on seuraava yläluokka, jossa on yksityinen ominaisuus:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Oletetaan, että alaluokassa päätimme tehdä menetelmän, joka kasvattaa ikää yhdellä. Yläluokan yksityisen ominaisuuden muuttamisyritys kuitenkin aiheuttaa virheen:
class Student extends User {
incAge() {
this.#age++; // virhe
}
}
Virhe katoaa, jos alaluokassa
esitellään yksityinen ominaisuus #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Siinä meitä odottaakin ansa! Oikeastaan loimme kaksi yksityistä ominaisuutta: yksi yläluokassa ja yksi alaluokassa. Ja ne toimivat täysin riippumattomasti. Tämä tarkoittaa, että yläluokan menetelmät muuttavat omia ominaisuuksiaan, ja alaluokan menetelmät - omiaan.
Tämä ongelma on oikeastaan ratkaistavissa. Yksityisiä yläluokan ominaisuuksia täytyy vain hallita yläluokan menetelmien kautta. Kirjoitetaan koodimme uudelleen tämän mukaisesti:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Voidaan yksinkertaistaa:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Seuraavassa koodissa alaluokassa ylikirjoitetaan yläluokan menetelmä. Korjaa tämän koodin ongelmat:
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;
}
}
}