जावास्क्रिप्ट, पाइथन या जावा जैसी भाषाओं की तरह, बहु-वरासत (मल्टीपल इनहेरिटेंस) को उसी तरह से सपोर्ट नहीं करता है। यह डिज़ाइन विकल्प “डायमंड प्रॉब्लम” जैसी जटिलताओं से बचता है, जहाँ वरासत में अस्पष्टताएँ उत्पन्न होती हैं। हालाँकि, समान कार्यक्षमता को चतुर तकनीकों जैसे कंपोजिशन और व्यवहारिक प्रतिनिधिमंडल (बिहेवियरल डेलीगेशन) के माध्यम से प्राप्त करना संभव है। यह लेख इन दृष्टिकोणों का पता लगाता है, उनकी ताकत और कमजोरियों को उजागर करता है।
विषय-सूची
कंपोजिशन: कार्यक्षमता का संयोजन
कंपोजिशन में एक नया वर्ग बनाना शामिल है जो उनसे वरासत में लिए बिना मौजूदा वर्गों की कार्यक्षमता का उपयोग करता है। यह बेहतर एनकैप्सुलेशन को बढ़ावा देता है और बहु-वरासत के नुकसान से बचाता है। हम वांछित वर्गों के उदाहरण बनाकर और उनकी विधियों को हमारे नए वर्ग में शामिल करके इसे प्राप्त करते हैं।
आइए एक व्यावहारिक उदाहरण के साथ समझाते हैं। मान लीजिए कि हमारे पास एक Car
वर्ग और एक Engine
वर्ग है:
class Car {
constructor(model) {
this.model = model;
}
drive() {
console.log(`${this.model} is driving.`);
}
}
class Engine {
start() {
console.log("Engine started.");
}
stop() {
console.log("Engine stopped.");
}
}
अब, आइए एक SportsCar
वर्ग बनाएँ जो Car
और Engine
दोनों को शामिल करता है:
class SportsCar {
constructor(model) {
this.car = new Car(model);
this.engine = new Engine();
}
drive() {
this.engine.start();
this.car.drive();
}
stop() {
this.engine.stop();
}
}
let mySportsCar = new SportsCar("Porsche 911");
mySportsCar.drive(); // Output: Engine started. Porsche 911 is driving.
mySportsCar.stop(); // Output: Engine stopped.
इस उदाहरण में, SportsCar
, Car
या Engine
से वरासत में नहीं लेता है, लेकिन यह प्रभावी रूप से उनकी कार्यक्षमता को जोड़ता है। यह दृष्टिकोण सरल और समझने में आसान है।
व्यवहारिक प्रतिनिधिमंडल: गतिशील विधि प्रेषण
व्यवहारिक प्रतिनिधिमंडल एक अधिक लचीला दृष्टिकोण प्रदान करता है। एक नया वर्ग अन्य वर्गों के उदाहरणों को विधि कॉल को सौंपता है, जिससे संदर्भ के आधार पर गतिशील व्यवहार परिवर्तन की अनुमति मिलती है। यह विशेष रूप से तब उपयोगी होता है जब वर्गों के बीच संबंध स्थिर नहीं होता है।
आइए Car
और Engine
उदाहरण पर फिर से विचार करें। हम एक DelegatingCar
वर्ग बनाएँगे:
class DelegatingCar {
constructor(delegates = []) {
this.delegates = delegates;
}
addDelegate(delegate) {
this.delegates.push(delegate);
}
performAction(action, ...args) {
for (const delegate of this.delegates) {
if (typeof delegate[action] === 'function') {
return delegate[action](...args);
}
}
throw new Error(`Action '${action}' not found.`);
}
}
let myDelegatingCar = new DelegatingCar([new Car("Ferrari"), new Engine()]);
myDelegatingCar.performAction('drive'); //Output: Ferrari is driving.
myDelegatingCar.performAction('start'); //Output: Engine started.
DelegatingCar
उपयुक्त प्रतिनिधि को अनुरोधों को रूट करने के लिए एक केंद्रीय performAction
विधि का उपयोग करता है। यह अधिक गतिशील नियंत्रण की अनुमति देता है, लेकिन यह साधारण कंपोजिशन की तुलना में जटिलता जोड़ता है।
सही दृष्टिकोण चुनना
कंपोजिशन और व्यवहारिक प्रतिनिधिमंडल दोनों जावास्क्रिप्ट में बहु-वरासत के शक्तिशाली विकल्प प्रदान करते हैं। कंपोजिशन आम तौर पर सरल और अधिक पठनीय होता है, जिससे यह अधिकांश परिदृश्यों के लिए उपयुक्त होता है। व्यवहारिक प्रतिनिधिमंडल गतिशील व्यवहार के लिए अधिक लचीलापन प्रदान करता है लेकिन अतिरिक्त जटिलताएँ जोड़ता है। इष्टतम विकल्प आपके आवेदन की विशिष्ट आवश्यकताओं पर निर्भर करता है। स्पष्टता और रखरखाव को प्राथमिकता देना महत्वपूर्ण है।