Problema de las propiedades privadas en la herencia de POO en JavaScript
El hecho de que las propiedades privadas no se hereden puede llevar a un problema inesperado. Veamos un ejemplo. Supongamos que tenemos la siguiente clase padre con una propiedad privada:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Supongamos que en la clase hija decidimos crear un método que incrementará la edad en uno. Sin embargo, el intento de cambiar la propiedad privada del padre conducirá a un error:
class Student extends User {
incAge() {
this.#age++; // error
}
}
El error desaparecerá si en la clase hija
declaramos la propiedad privada #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
¡Ahí es donde nos espera una trampa! En realidad, hemos creado dos propiedades privadas: una en el padre y una en el hijo. Y funcionan completamente de forma independiente. Esto significa que los métodos del padre modificarán su propiedad, y los métodos del hijo - la suya.
Este problema en realidad tiene solución. Simplemente hay que manipular las propiedades privadas del padre a través de los métodos de ese padre. Reescribamos nuestro código de acuerdo con esto:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Se puede simplificar:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
En el siguiente código, en la clase hija se redefine un método del padre. Corrija los problemas en este código:
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;
}
}
}