O problema das propriedades privadas na herança em POO em JavaScript
O fato de que propriedades privadas não são herdadas pode levar a um problema inesperado. Vamos ver um exemplo. Suponha que temos a seguinte classe pai com uma propriedade privada:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Suponha que na classe filha decidimos criar um método que irá aumentar a idade em um. No entanto, a tentativa de alterar a propriedade privada do pai resultará em um erro:
class Student extends User {
incAge() {
this.#age++; // erro
}
}
O erro desaparecerá se na classe filha
declararmos a propriedade privada #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
É aqui que nos espera uma armadilha! Na verdade, criamos duas propriedades privadas: uma no pai e uma na filha. E elas funcionam completamente de forma independente. Isso significa que os métodos do pai irão alterar sua própria propriedade, e os métodos da filha - as delas.
Este problema na verdade tem solução. Simplesmente é preciso manipular as propriedades privadas do pai através dos métodos desse pai. Vamos reescrever nosso código de acordo com isso:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Pode ser simplificado:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
No código a seguir, na classe filha, o método do pai é sobrescrito. Corrija os problemas neste 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;
}
}
}