Το πρόβλημα των ιδιωτικών ιδιοτήτων κατά την κληρονομικότητα στην ΑΟΠ στο JavaScript
Το γεγονός ότι οι ιδιωτικές ιδιότητες δεν κληρονομούνται, μπορεί να οδηγήσει σε ένα απροσδόκητο πρόβλημα. Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε την ακόλουθη γονική κλάση με μια ιδιωτική ιδιότητα:
class User {
#age;
setAge(age) {
this.#age = age;
}
getAge() {
return this.#age;
}
}
Ας υποθέσουμε ότι στην παιδική κλάση αποφασίσαμε να φτιάξουμε μια μέθοδο που θα αυξάνει την ηλικία κατά ένα. Ωστόσο, η προσπάθεια να αλλάξουμε την ιδιωτική ιδιότητα του γονέα θα οδηγήσει σε σφάλμα:
class Student extends User {
incAge() {
this.#age++; // σφάλμα
}
}
Το σφάλμα θα εξαφανιστεί εάν στην παιδική κλάση
δηλώσουμε την ιδιωτική ιδιότητα #age:
class Student extends User {
#age;
incAge() {
this.#age++;
}
}
Εδώ μας περιμένει η παγίδα! Στην πραγματικότητα δημιουργήσαμε δύο ιδιωτικές ιδιότητες: μία στον γονέα και μία στον απόγονό. Και λειτουργούν εντελώς ανεξάρτητα. Αυτό σημαίνει ότι οι μέθοδοι του γονέα θα τροποποιούν τη δική τους ιδιότητα, ενώ οι μέθοδοι του απογόνου - τις δικές τους.
Αυτό το πρόβλημα στην πραγματικότητα έχει λύση. Απλά χρειάζεται να χειριζόμαστε τις ιδιωτικές ιδιότητες του γονέα μέσω των μεθόδων αυτού του γονέα. Ας ξαναγράψουμε τον κώδικά μας σύμφωνα με αυτό:
class Student extends User {
incAge() {
let age = this.getAge();
age++;
this.setAge(age);
}
}
Μπορούμε να απλοποιήσουμε:
class Student extends User {
incAge() {
this.setAge(++this.getAge());
}
}
Στον ακόλουθο κώδικα στην παιδική κλάση επικαλύπτεται η μέθοδος του γονέα. Διορθώστε τα προβλήματα σε αυτόν τον κώδικα:
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;
}
}
}