जावास्क्रिप्ट में ओओपी में इनहेरिटेंस के दौरान प्राइवेट प्रॉपर्टीज़ की समस्या
प्राइवेट प्रॉपर्टीज़ का इनहेरिट न होना एक अप्रत्याशित समस्या पैदा कर सकता है। आइए एक उदाहरण के माध्यम से देखते हैं। मान लीजिए कि हमारे पास एक प्राइवेट प्रॉपर्टी वाला निम्नलिखित पैरेंट क्लास है:
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;
}
}
}