एकाधिक वंशानुक्रम

From alpha
Jump to navigation Jump to search

मल्टीप्ल इन्हेरिटेंस कुछ ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग लैंग्वेज की ऐसी विशेषता है जिसमें ऑब्जेक्ट या क्लास से अधिक पैरेंट ऑब्जेक्ट या पैरेंट क्लास से फीचर्स इनहेरिट से कर सकता है। यह सिंगल इन्हेरिटेंस (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) से भिन्न है, जहाँ ऑब्जेक्ट या क्लास केवल पर्टिकुलर ऑब्जेक्ट या क्लास से प्राप्त हो सकता है।

मल्टीप्ल इन्हेरिटेंस कई वर्षों से कोन्त्रोवेर्सिअल विषय रहा है,[1][2] विरोधियों के साथ "डाइमंड प्रॉब्लम" जैसी स्थितियों में इसकी बढ़ी हुई कोम्प्लेक्सिटी एवं अम्बिगुइटी की ओर संकेत देते हुए, जहां यह एम्बिगुयस हो सकता है कि कौन सा मूल क्लास पर्टिकुलर विशेषता है यदि अधिक मूल क्लास उक्त विशेषता को आरम्भ करते हैं तो इनहेरिटेंस में मिला, वर्चुअल इनहेरिटेंस का उपयोग करने के साथ इसे विभिन्न उपायों से संबोधित किया जा सकता है।[3] अम्बिगुइटी को संबोधित करने के लिए ऑब्जेक्ट कम्पोजीशन के वैकल्पिक उपायों जैसे मिक्सिंस एवं ट्रेट्स जैसे इन्हेरिटेंस पर आधारित प्रस्तावित नहीं किया गया है।

विवरण

ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग (OOP) में, इन्हेरिटेंस दो क्लासेज के मध्य सिंगल संबंध का वर्णन करता है जिसमें (चाइल्ड क्लास) क्लास, पैरेंट क्लास को उप-वर्गित करता है। बच्चा पैरेंट की मेथड एवं विशेषताओं को इनहेरिटेंस में प्राप्त करता है, जिससे भागीदारी में कार्यक्षमता की अनुमति मिलती है। उदाहरण के लिए, कोई चर क्लास स्तनपायी बना सकता है जिसमें खाने, प्रजनन, आदि जैसी विशेषताएं हों I सिंगल चाइल्ड क्लास कैट को परिभाषित करती है, जो चूहों का पीछा करने जैसी नई सुविधाओं को जोड़ते हुए उन विशेषताओं को एम्बिगुइटी रूप से प्रोग्राम किए बिना प्रदान करती है।

मल्टीप्ल इन्हेरिटेंस प्रोग्रामर्स को साथ में पूर्ण रूप से ऑर्थोगोनल पदानुक्रम का उपयोग करने की अनुमति देता है, जैसे कि कैट को कार्टून चरित्र एवं पेट एवं स्तनपायी से इनहेरिट करने की अनुमति देना एवं उन सभी क्लासेज के अंदर सुविधाओं तक पहुंच बनाना है।

इम्प्लीमेंटेशन

मल्टीप्ल इन्हेरिटेंस का समर्थन करने वाली लैंग्वेज में सम्मलित हैं: सी++, कॉमन लिस्प (कॉमन लिस्प ऑब्जेक्ट सिस्टम (CLOS) के माध्यम से), यूलिस्प (यूलिस्प ऑब्जेक्ट सिस्टम टेलोस के माध्यम से), कर्ल (प्रोग्रामिंग लैंग्वेज), डायलन (प्रोग्रामिंग लैंग्वेज), एफिल (प्रोग्रामिंग लैंग्वेज), लोगटॉक, ऑब्जेक्ट रेक्सस, स्काला (प्रोग्रामिंग लैंग्वेज) (मिक्सिन क्लासेस के उपयोग के माध्यम से), OCaml, पर्ल, POP-11, पायथन (प्रोग्रामिंग लैंग्वेज), R (प्रोग्रामिंग लैंग्वेज),(Raku)राकू (प्रोग्रामिंग लैंग्वेज), एवं Tcl (बिल्ट-इन) 8.6 से या पिछले संस्करणों में इंक्रीमेंटल Tcl (Incr Tcl) के माध्यम से[4][5])आदि होते है।

आईबीएम सिस्टम ऑब्जेक्ट मॉडल (एसओएम) रनटाइम मल्टीप्ल इन्हेरिटेंस का समर्थन करता है, एवं एसओएम को लक्षित करने वाली कोई भी प्रोग्रामिंग लैंग्वेज कई आधारों से इनहेरिटेंस में मिली, नई एसओएम क्लासेज को प्रारम्भ कर सकती है।

कुछ ऑब्जेक्ट-ओरिएंटेड लैंग्वेज, जैसे कि स्विफ्ट (प्रोग्रामिंग लैंग्वेज), जावा (प्रोग्रामिंग लैंग्वेज), फोरट्रान अपने 2003 के संशोधन के पश्चात, सी, एवं रूबी (प्रोग्रामिंग लैंग्वेज) सिंगल इनहेरिटेंस को प्रारम्भ करती हैं, चूँकि शिष्टाचार (ऑब्जेक्ट- ओरिएंटेड प्रोग्रामिंग), या इनहेरिटेंस, मल्टीप्ल इनहेरिटेंस की कुछ कार्यक्षमता प्रदान करते हैं।

पीएचपी स्पेसिफिक विधि कार्यान्वयनों को इनहेरिट करने के लिए पर्टिकुलर क्लासेज का उपयोग करती है। रूबी कई उपायों को प्रदान करने के लिए मॉड्यूलर प्रोग्रामिंग का उपयोग करती है।

डाइमंड की प्रॉब्लम

डाइमंड क्लास इनहेरिटेंस डायग्राम।

डाइमंड की प्रॉब्लम (कभी-कभी "मृत्यु का घातक डाइमंड" [6]के रूप में संदर्भित) अम्बिगुइटी है जो तब उत्पन्न होती है जब दो क्लास B एवं सी A से प्राप्त होते हैं, एवं क्लास D B एवं सी दोनों से प्राप्त होता है। A में वह विधि जिसे B एवं सी ने ओवरराइड किया है (प्रोग्रामिंग) है, एवं D इसे ओवरराइड नहीं करता है , तो विधि का कौन सा वर्जन D इनहेरिट करता है: B का, या सी का?

उदाहरण के लिए, जीयूआई सॉफ्टवेयर विकास के रिफरेन्स में, क्लास Button दोनों वर्गोंRectangle (उपस्थिति के लिए) एवं Clickable (कार्यक्षमता/इनपुट हैंडलिंग के लिए), से प्राप्त हो सकता है, एवं Rectangle एवं Clickable करने योग्य दोनों Objectवर्ग से प्राप्त होते हैं। अब यदि equals विधि को प्रारम्भ किया जाता है Button object एवंButton क्लास इसमें ऐसी कोई विधि नहीं है,किन्तु आयताकार या क्लिक करने योग्य ओवरराइड equalsविधि है, अंततःRectangle या Clickable (दोनों), किस विधि को प्रारम्भ किया जाना चाहिए?

इस स्थिति में क्लास इन्हेरिटेंस आरेख के आकार के कारण इसे डाइमंड की प्रॉब्लम कहा जाता है। इस विषय में, क्लास A शीर्ष पर है, B एवं सी दोनों भिन्न-भिन्न इसके नीचे हैं, एवं D दोनों को सिंगल साथ जोड़कर डाइमंड की आकृति बनाता है।

मिटीगेशन

रिरिपीटएड इन्हेरिटेंस की इन समस्याओं से निवारण के लिए लैंग्वेज के भिन्न-भिन्न उपाये हैं।

  • सी (सी 8.0 के पश्चात से) डिफ़ॉल्ट इंटरफ़ेस विधि इम्प्लीमेंटेशन की अनुमति देता है, जिससे सिंगल क्लास बनता है A, इंटरफेस प्रारम्भ करना Ia एवं Ib डिफ़ॉल्ट इम्प्लीमेंटेशन वाले समान उपाये के साथ, सिंगल सिग्नेचर के साथ दो "इनहेरिटेंस में मिली" विधियां होती हैं, जिससे डाइमंड की प्रॉब्लम होती है। विधि को स्वयं प्रारम्भ करने के लिएA होने से इसे कम किया जाता है, इसलिए अम्बिगुइटी को दूर किया जाता है, या कॉल करने वाले को प्रथमAवस्तु को उस विधि के डिफ़ॉल्ट इम्प्लीमेंटेशन का उपयोग करने के लिए उपयुक्त इंटरफ़ेस पर बनाने के लिए फोर्स्ड किया जाता है(जैसे(Ia) aInstance).(Method)है|
  • सी++ डिफ़ॉल्ट रूप से प्रत्येक इन्हेरिटेंस पाथ का भिन्न-भिन्न अनुसरण करता है, इसलिएD ऑब्जेक्ट में वास्तव में दो भिन्न-भिन्न A ऑब्जेक्ट होंगे, एवं A के मेम्बेर्स के उपयोग को ठीक से योग्य होना चाहिए। यदि A से B की इनहेरिटेंस एवंA से Cकी इनहेरिटेंस दोनों virtualचिह्नित हैं (उदाहरण के लिए,class B: virtual public A) सी++ केवल सिंगल ऑब्जेक्ट बनाने के लिए पर्टिकुलर ध्यान रखता है, एवंAके मेम्बेर्स का उपयोग करता है सही रूप से कार्य करते हैं। यदि वर्चुअल इनहेरिटेंस एवं नॉन-वर्चुअल इनहेरिटेंस को मिलाया जाता है, तोAके लिए प्रत्येक वर्चुअल इनहेरिटेंस पाथ के लिए सिंगल वर्चुअल A एवं नॉन-वर्चुअल A प्रत्येक नॉन-वर्चुअल इनहेरिटेंस पाथ के लिए A होता है।सी ++ को एम्बिगुइटी रूप से यह बताने की आवश्यकता है कि किस मूल क्लास का उपयोग किया जाना है, अर्थात Worker::Human.Age सी++ एम्बिगुइटी दोहराया इनहेरिटेंस का समर्थन नहीं करता है क्योंकि सुपरक्लास का उपयोग करने के लिए योग्यता प्राप्त करने का कोई उपाये नहीं होगा (क्लास सिंगल से अधिक बार व्युत्पन्न सूची में दिखाई देती है [क्लास डॉग: पब्लिक एनिमल, एनिमल ]) सी++ वर्चुअल इनहेरिटेंस सिस्टम (Worker::Human एवं Musician::Human ऑब्जेक्ट का रिफरेन्स देगा) के माध्यम से मल्टीप्ल क्लास के उदाहरण को बनाने की अनुमति देता है।
  • कॉमन लिस्प सीएलओएस उचित डिफ़ॉल्ट बिहेवियर एवं इसे ओवरराइड करने की क्षमता दोनों प्रदान करने का प्रयास करता है। डिफ़ॉल्ट रूप से, इसे सीधे शब्दों में कहें, मेथड को D,B,सी,A,में सॉर्टेड किया जाता है, जब B को क्लास की परिभाषा में सी) से पूर्व लिखा जाता है। सबसे स्पेसिफिक आर्गुमेंट क्लासेज वाली विधि का सेलेक्ट किया गया है (D>(B,C)>A); फिर उस आर्डर में जिसमें सबक्लास परिभाषा (B>C) में मूल क्लासेज का नाम दिया गया है। चूँकि, प्रोग्रामर सिंगल स्पेसिफिक विधि रिज़ॉल्यूशन ऑर्डर देकर या मेथड के कॉम्बिनेशन के लिए सिंगल नियम बताकर इसे ओवरराइड कर सकता है। इसे मेथड कॉम्बिनेशन कहा जाता है, जिसे पूर्ण रूप से कंट्रोल किया जा सकता है। एमओपी (मेटाऑब्जेक्ट प्रोटोकॉल) सिस्टम की स्टेबिलिटी को प्रभावित किए बिना इनहेरिटेंस, डायनामिक डिस्पैच, क्लास इंस्टेंटेशन एवं अन्य इंटरनल सिस्टम को संशोधित करने के साधन भी प्रदान करता है।
  • कर्ल (प्रोग्रामिंग लैंग्वेज) केवल उन क्लासेज को अनुमति देता है जिन्हें एम्बिगुइटी रूप से भाग के रूप में चिह्नित किया जाता है, जिससे वे बारंबार इनहेरिटेंस में मिलें। शेयर्ड क्लासेज को क्लास में प्रत्येक रेगुलर कन्स्ट्रुक्टर (कंप्यूटर विज्ञान) के लिए सिंगल सेकेंडरी कन्स्ट्रुक्टर को परिभाषित करना चाहिए। रेगुलर कंस्ट्रक्टर को प्रथम बार कहा जाता है, कि शेयर्ड क्लास के लिए स्टेट को सिंगल सबक्लास कन्स्ट्रुक्टर के माध्यम से आरंभ किया जाता है, एवं अन्य सभी सबक्लास के लिए सेकेंडरी कन्स्ट्रुक्टर को प्रारम्भ किया जाएगा।
  • एफिल (प्रोग्रामिंग लैंग्वेज) में, अनसस्टर्स की विशेषताओं को चयनित एवं नाम परिवर्तित के निर्देशों के साथ एम्बिगुइटी रूप से सेलेक्ट किया जाता है। यह आधार क्लास की सुविधाओं को उसके डेस्केन्डेंट्स के मध्य शेयर्ड करने या उनमें से प्रत्येक को आधार क्लास की सिंगल भिन्न प्रति देने की अनुमति देता है। एफिल अनसस्टर्स क्लासेज से इनहेरिटेंस में मिली सुविधाओं को एम्बिगुइटी रूप से जोड़ने या भिन्न करने की अनुमति देता है। यदि सुविधाओं का नाम एवं इम्प्लीमेंटेशन सिंगल जैसा है, तो एफिल स्वचालित रूप से सुविधाओं में सम्मलित हो जाएगा। क्लास राइटर के पास उन्हें भिन्न करने के लिए इनहेरिटेंस में मिली सुविधाओं का नाम परिवर्तन करने का विकल्प होता है। एफिल विकास में इन्हेरिटेंस सिंगल कॉमन इवेंट है; डेटा स्ट्रक्चर एवं एल्गोरिदम की व्यापक रूप से उपयोग की जाने वाली एफिलबेस लाइब्रेरी में अधिकांश इफेक्टिव क्लासेज, उदाहरण के लिए, दो या दो से अधिक पैरेंट हैं।[7]
  • गो (प्रोग्रामिंग लैंग्वेज) कम्पाइल टाइम पर डाइमंड की प्रॉब्लम को बाधित करता है। यदि सिंगल कम्पोजीशन D दो स्ट्रक्चर को एम्बेड करता है B एवं C जिसमें दोनों का सिंगल उपाये है F(), इस प्रकार सिंगल इंटरफ़ेस को संतुष्ट करता है A, कम्पाइल एम्बिगुयस सिलेक्टर के विषय में विचार करेगा, यदि D.F() कहा जाता है, या यदि Dका उदाहरण सेलेक्ट किया गया हैA. B एवं Cके उपाये को एम्बिगुइटी रूप से D.B.F() या D.C.F()कहा जा सकता हैI
  • जावा (प्रोग्रामिंग लैंग्वेज) 8 इंटरफेस पर डिफ़ॉल्ट उपाये को प्रस्तुत करता है। यदि A,B,सी इंटरफेस हैं, B,सी प्रत्येक A के अब्स्ट्रक्ट विधि के लिए भिन्न इम्प्लीमेंटेशन प्रदान कर सकता है, जिससे डाइमंड की प्रॉब्लम हो सकती है, या तो क्लास D विधि को फिर से प्रारम्भ करना चाहिए (जिसकी बॉडी केवल सुपर इम्प्लीमेंटेशन में से किसी की कॉल फॉरवर्ड कर सकता है), या अम्बिगुइटी को कम्पाइल एरर के रूप में अस्वीकार कर दिया जाएगा।[8] जावा 8 से पूर्व, जावा डाइमंड प्रॉब्लम रिस्क के अधीन नहीं था, क्योंकि यह मल्टीप्ल इन्हेरिटेंस का समर्थन नहीं करता था एवं इंटरफ़ेस डिफ़ॉल्ट के उपाये उपलब्ध नहीं थे।
  • वर्जन 1.2 में जावा-FX स्क्रिप्ट मिक्सिन्स के उपयोग के माध्यम से मल्टीप्ल इन्हेरिटेंस की अनुमति देता है। विरोध की स्तिथि में, कम्पाइल एम्बिगुयस चर या प्रोग्राम के प्रत्यक्ष उपयोग को प्रतिबंधित करता है। प्रत्येक इनहेरिटेंस में मिले सदस्य को अभी भी ऑब्जेक्ट को ब्याज के मिश्रण में रखकर पहुँचा जा सकता है, उदाहरण के लिए (individual as Person).printInfo();
  • कोटलिन (प्रोग्रामिंग लैंग्वेज) इंटरफ़ेस के कई इन्हेरिटेंस की अनुमति देता है, चूँकि, हीरासमस्या परिदृश्य में, चाइल्ड क्लास को उस विधि को ओवरराइड करना चाहिए जो इन्हेरिटेंस संघर्ष का कारण बनती है एवं निर्दिष्ट करती है, कि किस पैरेंट क्लास इम्प्लीमेंटेशन का उपयोग किया जाना चाहिए। उदाहरण के लिए super<ChosenParentInterface>.someMethod()
  • लॉगटॉक इंटरफ़ेस एवं इम्प्लीमेंटेशन बहु-इनहेरिटेंस दोनों का समर्थन करता है, विधि उपनामों की घोषणा की अनुमति देता है, जो नाम परिवर्तन एवं उन मेथड तक संपर्क प्रदान करता है जो डिफ़ॉल्ट संघर्ष सॉल्व सिस्टम द्वारा उच्चारित होंगे।
  • ओकैमल(OCaml) में, क्लास परिभाषा के मुख्य भाग में पैरेंट क्लास को भिन्न रूप से निर्दिष्ट किया जाता है। मेथड (एवं विशेषताओं) को उसी आर्डर में इनहेरिटेंस में मिला है, जिसमें प्रत्येक नई इनहेरिटेंस विधि किसी भी उपस्थित मेथड को ओवरराइड कर रही है। अम्बिगुइटी के अनुसार उपयोग करने के लिए किस विधि इम्प्लीमेंटेशन का सॉल्व करने के लिए ओकैमल क्लास इनहेरिटेंस सूची की लास्ट मिलान परिभाषा का सेलेक्ट करता है। डिफ़ॉल्ट बिहेवियर को ओवरराइड करने के लिए, डिजायर्ड क्लास परिभाषा के साथ विधि कॉल को योग्यता प्राप्त होती है।
  • पर्ल आदेशित सूची के रूप में इन्हेरिटेंस करने के लिए क्लासेज की सूची का उपयोग करता है। कंपाइलर प्रथम विधि का उपयोग करता है, जो इसे सुपरक्लास सूची की घनिष्ठ-प्रथम अनुसंधान या क्लास पदानुक्रम के C3 रैखिकरण का उपयोग करके मिलती है। विभिन्न एकल्सटेंशन वैकल्पिक क्लास कम्पोजीशन योजनाएँ प्रदान करते हैं। इन्हेरिटेंस का आर्डर क्लास शब्दार्थ को प्रभावित करता है। उपरोक्त अम्बिगुइटी में, class B एवं उसके अनसस्टर्स की क्लास से पूर्व परीक्षण किया जायेगा, इसलिए Aमें विधिBके माध्यम से इनहेरिटेंस में मिलेगा, इसे Io (प्रोग्रामिंग लैंग्वेज) एवं (Picolisp) पिकोलिसप के साथ भागीदारी की गयी है। पर्ल में, इस बिहेवियर को C3 रैखिककरण या अन्य एल्गोरिदम का उपयोग करने के लिए mroया अन्य मॉड्यूल का उपयोग करके ओवरराइड किया जा सकता हैI[9]
  • पायथन (प्रोग्रामिंग लैंग्वेज) में पर्ल के समान कम्पोजीशन है, किन्तु, पर्ल के विपरीत, इसे लैंग्वेज के वाक्य-विन्यास में सम्मलित करता है। इन्हेरिटेंस का आर्डर क्लास शब्दार्थ को प्रभावित करता है। पायथन को नई शैली की क्लासेज के प्रारम्भ में इसका सामना करना पड़ा, जिनमें से सभी का सिंगल कॉमन अनसस्टर्स ऑब्जेक्ट (object)है, पायथन C3 रैखिककरण (या मेथड रेज़ोल्यूशन ऑर्डर (MRO) एल्गोरिथम का उपयोग करके क्लासेज की सिंगल सूची बनाता है। वह एल्गोरिथ्म दो बाधाओं को प्रारम्भ करता है: बच्चे अपने पैरेंट से पूर्व आते हैं एवं यदि क्लास कई क्लासेज से इनहेरिटेंस में मिलता है, तो उन्हें आधार क्लासेज के टपल में निर्दिष्ट आर्डर में रखा जाता है (चूँकि इस विषय में, इन्हेरिटेंस ग्राफ में उच्च कुछ क्लास निम्न क्लासेज से पूर्व हो सकते हैं) लेखाचित्र[10]) इस प्रकार, विधि संकल्प आर्डर है: D, B, सी, A[11]
  • रूबी (प्रोग्रामिंग लैंग्वेज) क्लासेज में वास्तव में पैरेंट होते हैं, किन्तु कई मॉड्यूल से भी प्राप्त हो सकते हैं; माणिक क्लास की परिभाषाओं को निष्पादित किया जाता है, एवं सिंगल विधि की (पुनः) परिभाषा निष्पादन के टाइम पूर्व से ही उपस्थित किसी भी परिभाषा को एम्बिगुयस करती है। रनटाइम मेटाप्रोग्रामिंग की अनुपस्थिति में इसमें लगभग वही शब्दार्थ है जो सब से सही घनिष्ठ के प्रथम रिज़ॉल्यूशन के रूप में है।
  • स्काला (प्रोग्रामिंग लैंग्वेज) ट्रेट्स के मल्टीप्ल इंस्टेंटेशन की अनुमति देता है, जो क्लास पदानुक्रम एवं ट्रेट्स पदानुक्रम के मध्य अंतर जोड़कर मल्टीप्ल इन्हेरिटेंस की अनुमति देता है। सिंगल क्लास केवल सक्सेसर हो सकता है, किन्तु डिजायर्ड के रूप में कई ट्रेट्स को मिक्स-इन कर सकता है। स्कैला रिजल्ट सीरीज में प्रत्येक मॉड्यूल की लास्ट इवेंट को सेक्रिफाइस करके सभी को समाप्त करने से पूर्व एक्सटेंडेड 'ट्रेट्स' की राइट-फर्स्ट डेप्थ-फर्स्ट सर्च का उपयोग करके विधि नामो का सॉल्व करता है। तो, रिज़ॉल्यूशन क्रम है: [D, C, A, B, A], जो कम [D, C, B, A] हो जाता है।
  • टीसीएल कई मूल क्लासेज की अनुमति देता है; क्लास डिक्लेरेशन में विशिष्टता का आर्डर C3 लीनियर एल्गोरिथम का उपयोग करने वाले मेम्बेर्स के लिए नाम के सॉल्व को प्रभावित करता है।[12]

ऐसी लैंग्वेज जो केवल सिंगल इन्हेरिटेंस की अनुमति देती हैं, जहाँ क्लास केवल सिंगल आधार क्लास से प्राप्त हो सकता है, डाइमंड की प्रॉब्लम नहीं है, इसका कारण यह है कि ऐसी लैंग्वेज में मेथड की रेपीटीशन या प्लेसमेंट का ध्यान किए बिना इन्हेरिटेंस सीरीज में किसी भी लेवल पर किसी भी मेथड का अधिकतम इम्प्लीमेंटेशन होता है। सामान्यतः ये लैंग्वेज क्लासेज को कई प्रोटोकॉल स्टार्ट करने की अनुमति देती हैं, जिन्हें जावा में इंटरफ़ेस कहा जाता है। ये प्रोटोकॉल मेथड को परिभाषित करते हैं किन्तु, इम्प्लीमेंटेशन प्रदान नहीं करते हैं। इसका उपयोग एक्शन स्क्रिप्ट, सी शार्प (प्रोग्रामिंग लैंग्वेज) सी, D (प्रोग्रामिंग लैंग्वेज), जावा (प्रोग्रामिंग लैंग्वेज), नेमर्ले, (Nemerle) ऑब्जेक्ट पास्कल (Object Pascal), ओब्जेटिव सी, स्मॉलटॉक, स्विफ्ट (प्रोग्रामिंग लैंग्वेज) एवं पीएचपी (PHP) (प्रोग्रामिंग लैंग्वेज) द्वारा किया गया है।[13] ये सभी लैंग्वेज क्लासेज को कई प्रोटोकॉल प्रारम्भ करने की अनुमति देती हैं।

इसके अतिरिक्त, Ada, सी (प्रोग्रामिंग लैंग्वेज), जावा, ऑब्जेक्ट पास्कल, ऑब्जेक्ट-सी, स्विफ्ट एवं पीएचपी (PHP) इंटरफेस के मल्टीपल-इनहेरिटेंस की अनुमति देते हैं (ओब्जेटिव-सी) एवं स्विफ्ट में प्रोटोकॉल कहा जाता है)। इंटरफेस अब्स्ट्रक्ट आधार क्लासेज के जैसे हैं, जो किसी भी बिहेवियर को प्रारम्भ किए बिना, विधि सिग्नेचर निर्दिष्ट करते हैं। ("जावा में वर्जन 7 तक के प्योर" इंटरफ़ेस इंटरफ़ेस में किसी भी इम्प्लीमेंटेशन या इंस्टेंस डेटा की अनुमति नहीं देते हैं।) पुनः कई इंटरफेस विधि सिग्नेचर की घोषणा करते हैं, जैसे ही वह विधि प्रारम्भ होती है (परिभाषित) इनहेरिटेंस सीरीज में कहीं भी, यह उस विधि के किसी भी इम्प्लीमेंटेशन को इसके ऊपर की सीरीज में (इसके सुपरक्लास में) ओवरराइड करता है। इसलिए, इनहेरिटेंस सीरीज में किसी भी लेवल पर, किसी भी विधि का अधिकतम इम्प्लीमेंटेशन हो सकता है। इस प्रकार, सिंगल इन्हेरिटेंस विधि इम्प्लीमेंटेशन इंटरफेस के मल्टीप्ल इन्हेरिटेंस के साथ भी डाइमंड प्रॉब्लम को प्रदर्शित नहीं करता है। जावा 8 एवं सी# 8 में इंटरफेस के लिए डिफ़ॉल्ट इम्प्लीमेंटेशन की प्रारम्भ के साथ, डाइमंड प्रॉब्लम उत्पन्न करना अभी भी संभव है, चूंकि यह केवल कम्पाइल-टाइम एरर के रूप में दिखाई देता है।

यह भी देखें

रिफरेन्स

  1. Cargill, T. A. (Winter 1991). "Controversy: The Case Against Multiple Inheritance in C++". Computing Systems. 4 (1): 69–82.
  2. Waldo, Jim (Spring 1991). "Controversy: The Case For Multiple Inheritance in C++". Computing Systems. 4 (2): 157–171.
  3. Schärli, Nathanael; Ducasse, Stéphane; Nierstrasz, Oscar; Black, Andrew. "Traits: Composable Units of Behavior" (PDF). Web.cecs.pdx.edu. Retrieved 2016-10-21.
  4. "incr Tcl". blog.tcl.tk. Retrieved 2020-04-14.
  5. "Introduction to the Tcl Programming Language". www2.lib.uchicago.edu. Retrieved 2020-04-14.
  6. Martin, Robert C. (1997-03-09). "Java and C++: A critical comparison" (PDF). Objectmentor.com. Archived from the original (PDF) on 2005-10-24. Retrieved 2016-10-21.
  7. "Standard ECMA-367". Ecma-international.org. Retrieved 2016-10-21.
  8. "State of the Lambda". Cr.openjdk.java.net. Retrieved 2016-10-21.
  9. "perlobj". perldoc.perl.org. Retrieved 2016-10-21.
  10. Abstract. "The Python 2.3 Method Resolution Order". Python.org. Retrieved 2016-10-21.
  11. "Unifying types and classes in Python 2.2". Python.org. Retrieved 2016-10-21.
  12. "Manpage of class". Tcl.tk. 1999-11-16. Retrieved 2016-10-21.
  13. "Object Interfaces - Manual". PHP.net. 2007-07-04. Retrieved 2016-10-21.


अग्रिम पठन


बाहरी संबंध