ปัญหาของคุณสมบัติส่วนตัวในการสืบทอดใน OOP ใน 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;
    }
  }
}