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