Το πρόβλημα των ιδιωτικών ιδιοτήτων κατά την κληρονομικότητα στην ΑΟΠ στο JavaScript

Το γεγονός ότι οι ιδιωτικές ιδιότητες δεν κληρονομούνται, μπορεί να οδηγήσει σε ένα απροσδόκητο πρόβλημα. Ας δούμε ένα παράδειγμα. Ας υποθέσουμε ότι έχουμε την ακόλουθη γονική κλάση με μια ιδιωτική ιδιότητα:

javascriptclass User {
  #age;
  
  setAge(age) {
    this.#age = age;
  }
  getAge() {
    return this.#age;
  }
}

Ας υποθέσουμε ότι στην παιδική κλάση αποφασίσαμε να φτιάξουμε μια μέθοδο που θα αυξάνει την ηλικία κατά ένα. Ωστόσο, η προσπάθεια να αλλάξουμε την ιδιωτική ιδιότητα του γονέα θα οδηγήσει σε σφάλμα:

javascriptclass Student extends User {
  incAge() {
    this.#age++; // σφάλμα
  }
}

Το σφάλμα θα εξαφανιστεί εάν στην παιδική κλάση δηλώσουμε την ιδιωτική ιδιότητα #age:

javascriptclass Student extends User {
  #age;
  
  incAge() {
    this.#age++;
  }
}

Εδώ μας περιμένει η παγίδα! Στην πραγματικότητα δημιουργήσαμε δύο ιδιωτικές ιδιότητες: μία στον γονέα και μία στον απόγονό. Και λειτουργούν εντελώς ανεξάρτητα. Αυτό σημαίνει ότι οι μέθοδοι του γονέα θα τροποποιούν τη δική τους ιδιότητα, ενώ οι μέθοδοι του απογόνου - τις δικές τους.

Αυτό το πρόβλημα στην πραγματικότητα έχει λύση. Απλά χρειάζεται να χειριζόμαστε τις ιδιωτικές ιδιότητες του γονέα μέσω των μεθόδων αυτού του γονέα. Ας ξαναγράψουμε τον κώδικά μας σύμφωνα με αυτό:

javascriptclass Student extends User {
  incAge() {
    let age = this.getAge();
    age++;
    this.setAge(age);
  }
}

Μπορούμε να απλοποιήσουμε:

javascriptclass Student extends User {
  incAge() {
    this.setAge(++this.getAge());
  }
}
Задание 1

Στον ακόλουθο κώδικα στην παιδική κλάση επικαλύπτεται η μέθοδος του γονέα. Διορθώστε τα προβλήματα σε αυτόν τον κώδικα:

javascriptclass User {
  #name;
  
  setName(name) {
    this.#name = name;
  }
  getName() {
    return this.#name;
  }
}

class Employee extends User {
  setName(name) {
    if (name.length > 0) {
      this.#name = name;
    }
  }
}