एकाधिक प्रेषण

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

प्रेषण को समझना
कंप्यूटर सॉफ़्टवेयर के डेवलपर्स आमतौर पर स्रोत कोड को नामित ब्लॉकों में व्यवस्थित करते हैं जिन्हें विभिन्न प्रकार से सबरूटीन्स, प्रक्रियाओं, उपप्रोग्राम, फ़ंक्शंस या विधियों कहा जाता है। फ़ंक्शन में कोड को कॉल करके निष्पादित किया जाता है - कोड का एक टुकड़ा निष्पादित करना जो उसके नाम का संदर्भ देता है। यह अस्थायी रूप से कॉल किए गए फ़ंक्शन पर नियंत्रण स्थानांतरित करता है; जब फ़ंक्शन का निष्पादन पूरा हो जाता है, तो नियंत्रण को आमतौर पर कॉल करने वाले के निर्देश पर वापस स्थानांतरित कर दिया जाता है जो संदर्भ का अनुसरण करता है।

फ़ंक्शन नाम आमतौर पर फ़ंक्शन के उद्देश्य के वर्णनात्मक होने के लिए चुने जाते हैं। कभी-कभी कई कार्यों को एक ही नाम देना वांछनीय होता है, अक्सर क्योंकि वे वैचारिक रूप से समान कार्य करते हैं, लेकिन विभिन्न प्रकार के इनपुट डेटा पर काम करते हैं। ऐसे मामलों में, फ़ंक्शन कॉल साइट पर नाम का संदर्भ निष्पादित किए जाने वाले कोड के ब्लॉक की पहचान करने के लिए पर्याप्त नहीं है। इसके बजाय, फ़ंक्शन कॉल के तर्कों की संख्या और प्रकार का उपयोग कई फ़ंक्शन कार्यान्वयनों में से चुनने के लिए भी किया जाता है।

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

इसके विपरीत, एकाधिक प्रेषण वाली भाषाओं में, चयनित विधि केवल वह है जिसके तर्क फ़ंक्शन कॉल की संख्या और प्रकार से मेल खाते हैं। कोई विशेष तर्क नहीं है जो किसी विशेष कॉल में किए गए फ़ंक्शन/विधि का स्वामी हो।

कॉमन लिस्प ऑब्जेक्ट सिस्टम (CLOS) मल्टीपल डिस्पैच का एक प्रारंभिक और प्रसिद्ध उदाहरण है। एकाधिक प्रेषण के उपयोग का एक और उल्लेखनीय उदाहरण जूलिया (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा है।

मल्टीपल डिस्पैच को समारोह अधिभार  से अलग किया जाना चाहिए, जिसमें स्टेटिक टाइपिंग जानकारी, जैसे किसी शब्द की घोषित या अनुमानित प्रकार (या सबटाइपिंग वाली भाषा में आधार प्रकार) का उपयोग यह निर्धारित करने के लिए किया जाता है कि किसी कॉल साइट पर कई संभावनाओं का उपयोग किया जाएगा। और यह निर्धारण संकलन या लिंक समय (या कार्यक्रम निष्पादन शुरू होने से पहले किसी अन्य समय) पर किया जाता है और उसके बाद किसी दिए गए परिनियोजन या कार्यक्रम को चलाने के लिए अपरिवर्तनीय होता है। कई भाषाएँ जैसे C++ मजबूत फंक्शन ओवरलोडिंग की पेशकश करती हैं लेकिन डायनेमिक मल्टीपल डिस्पैच की पेशकश नहीं करती हैं (C++ केवल वर्चुअल फ़ंक्शंस के उपयोग के माध्यम से डायनेमिक सिंगल डिस्पैच की अनुमति देता है)।

डेटा प्रकार
उन भाषाओं के साथ काम करते समय जो संकलन समय पर डेटा प्रकारों में भेदभाव कर सकती हैं, तब विकल्पों में से चयन हो सकता है। संकलन समय चयन के लिए ऐसे वैकल्पिक कार्यों को बनाने का कार्य आमतौर पर फ़ंक्शन ओवरलोडिंग फ़ंक्शन के रूप में जाना जाता है।

प्रोग्रामिंग भाषाओं में जो रन टाइम (यानी, देर से बांधना ) तक डेटा प्रकार की पहचान को रोकते हैं, वैकल्पिक कार्यों के बीच चयन तब होना चाहिए, जो गतिशील रूप से निर्धारित प्रकार के फ़ंक्शन तर्कों पर आधारित हो। ऐसे कार्य जिनके वैकल्पिक कार्यान्वयन इस तरीके से चुने जाते हैं, उन्हें आम तौर पर मल्टीमेथ्स के रूप में संदर्भित किया जाता है।

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

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

अभिव्यक्ति और प्रतिरूपकता
सबसे लोकप्रिय प्रोग्रामिंग भाषा में, स्रोत कोड वितरित किया जाता है और कार्यक्षमता के कणिकाओं में तैनात किया जाता है जिसे हम यहां पैकेज कहेंगे; इस अवधारणा के लिए वास्तविक शब्दावली भाषा के बीच भिन्न होती है। प्रत्येक पैकेज में कई प्रकार, मान और फ़ंक्शन परिभाषाएँ हो सकती हैं, पैकेजों को अक्सर एक संकलन चरण के साथ अलग-अलग भाषाओं में संकलित किया जाता है, और एक गैर-चक्रीय निर्भरता संबंध मौजूद हो सकता है। एक पूरा कार्यक्रम संकुल का एक सेट है, एक मुख्य पैकेज के साथ जो कई अन्य संकुलों पर निर्भर हो सकता है, और पूरे कार्यक्रम में निर्भरता संबंध के सकर्मक समापन शामिल है।

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


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

अस्पष्टता
यह आम तौर पर वांछनीय है कि बहु-पद्धति के किसी भी आह्वान के लिए, बहु-पद्धति के कार्यान्वयन मामलों में से एक सबसे अच्छा उम्मीदवार हो, और/या यदि ऐसा नहीं है, तो इसे एक पूर्वानुमानित और नियतात्मक तरीके से हल किया जा सकता है।, विफलता सहित। गैर-नियतात्मक व्यवहार अवांछनीय है। एक गैर-परिपत्र उपप्रकार संबंध के साथ प्रकारों के एक सेट को मानते हुए, कोई यह परिभाषित कर सकता है कि बहु-विधि का एक कार्यान्वयन बेहतर (अधिक विशिष्ट) है यदि सभी गतिशील रूप से प्रेषित तर्क पहले में निर्दिष्ट सभी गतिशील रूप से प्रेषित तर्कों के उपप्रकार हैं। दूसरा, और कम से कम एक सख्त उपप्रकार है। सिंगल डिस्पैच और एकाधिक वंशानुक्रम  के अभाव में, यह स्थिति मामूली रूप से संतुष्ट है, लेकिन मल्टीपल डिस्पैच के साथ, दो या दो से अधिक उम्मीदवारों के लिए दी गई वास्तविक तर्क सूची को संतुष्ट करना संभव है, लेकिन दोनों में से कोई भी दूसरे से अधिक विशिष्ट नहीं है (एक गतिशील तर्क एक मामले में उप प्रकार होने के नाते, दूसरे मामले में उप प्रकार)। यह विशेष रूप से तब हो सकता है जब दो अलग-अलग पैकेज, न तो दूसरे पर निर्भर करते हैं, दोनों प्रत्येक पैकेज के प्रकार से संबंधित कार्यान्वयन के साथ कुछ बहु-विधि का विस्तार करते हैं, और फिर एक तीसरा पैकेज जिसमें दोनों (संभवतः अप्रत्यक्ष रूप से) शामिल होते हैं, फिर दोनों से तर्कों का उपयोग करके बहु-विधि का आह्वान करते हैं। संकुल।

संभावित प्रस्तावों में शामिल हैं:


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

दक्षता
प्रोग्रामिंग भाषाओं सहित एकल-प्रेषण का कुशल कार्यान्वयन, जो अलग-अलग ऑब्जेक्ट कोड के लिए संकलित हैं और एक निम्न-स्तर (भाषा-जागरूक नहीं) लिंकर से जुड़ा हुआ है, जिसमें गतिशील रूप से प्रोग्राम लोड/प्रारंभ समय पर या यहां तक ​​कि आवेदन की दिशा में भी शामिल है। कोड सर्वविदित हैं। C++ और अन्य प्रारंभिक OO भाषाओं में विकसित व्यवहार्य विधि (जहाँ प्रत्येक वर्ग में उस वर्ग के आभासी कार्यों के अनुरूप फ़ंक्शन पॉइंटर्स की एक सरणी होती है) लगभग स्थिर विधि कॉल के रूप में तेज़ होती है, जिसके लिए O(1) ओवरहेड और केवल एक अतिरिक्त मेमोरी लुकअप की आवश्यकता होती है। गैर-अनुकूलित मामले में भी। हालांकि, व्यवहार्य विधि फ़ंक्शन नाम का उपयोग करती है न कि तर्क प्रकार को इसकी लुकअप कुंजी के रूप में, और एकाधिक प्रेषण मामले में स्केल नहीं करती है। (यह कक्षाओं की विशेषताओं के तरीकों के वस्तु-उन्मुख प्रतिमान पर भी निर्भर करता है, न कि किसी विशेष डेटाटाइप से स्वतंत्र स्टैंडअलोन संस्थाओं पर)।

बहु-प्रेषण का कुशल कार्यान्वयन एक सतत शोध समस्या बनी हुई है।

अभ्यास में प्रयोग करें
यह अनुमान लगाने के लिए कि अभ्यास में कितनी बार एकाधिक प्रेषण का उपयोग किया जाता है, मुशेविसी एट अल। गतिशील प्रेषण का उपयोग करने वाले कार्यक्रमों का अध्ययन किया। उन्होंने छह अलग-अलग भाषाओं में लिखे गए नौ अनुप्रयोगों का विश्लेषण किया, जिनमें ज्यादातर कंपाइलर थे: कॉमन लिस्प ऑब्जेक्ट सिस्टम, डायलन (प्रोग्रामिंग भाषा),  सेसिल (प्रोग्रामिंग भाषा) , मल्टीजावा, डीजल और नाइस। उनके परिणाम बताते हैं कि 13–32% सामान्य कार्य एक तर्क के गतिशील प्रकार का उपयोग करते हैं, जबकि उनमें से 2.7–6.5% गतिशील प्रकार के कई तर्कों का उपयोग करते हैं। शेष 65-93% सामान्य कार्यों में एक ठोस विधि (ओवरराइडर) है, और इस प्रकार उनके तर्कों के गतिशील प्रकारों का उपयोग करने के लिए नहीं माना जाता है। इसके अलावा, अध्ययन की रिपोर्ट है कि 2-20% सामान्य कार्यों में दो और 3-6% में तीन ठोस कार्य कार्यान्वयन थे। अधिक ठोस ओवरराइडर्स वाले कार्यों के लिए संख्या तेजी से घटती है।

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

इन पत्रों के डेटा को निम्नलिखित तालिका में संक्षेपित किया गया है, जहाँ प्रेषण अनुपात  सामान्य कार्य प्रति विधियों की औसत संख्या है; पसंद अनुपात   विधियों की संख्या के वर्ग का माध्य है (बड़ी संख्या में विधियों के साथ कार्यों की आवृत्ति को बेहतर ढंग से मापने के लिए); और विशेषज्ञता की डिग्री   प्रति विधि प्रकार-विशिष्ट तर्कों की औसत संख्या है (अर्थात, उन तर्कों की संख्या जिन्हें प्रेषित किया जाता है):

सिद्धांत
कई डिस्पैचिंग भाषाओं का सिद्धांत सबसे पहले Castagna et al द्वारा विकसित किया गया था, जो देर से बाध्यकारी के साथ अतिभारित कार्यों के लिए एक मॉडल को परिभाषित करता है। इसने वस्तु-उन्मुख भाषाओं के सहप्रसरण और प्रतिप्रसरण (कंप्यूटर विज्ञान) की पहली औपचारिकता को जन्म दिया और बाइनरी विधियों की समस्या का समाधान।

उदाहरण
एकाधिक और एकल प्रेषण को एक उदाहरण से स्पष्ट किया जा सकता है। एक ऐसे खेल की कल्पना करें, जिसमें (उपयोगकर्ता-दृश्यमान) वस्तुएं, अंतरिक्ष यान और क्षुद्रग्रह हैं। जब दो ऑब्जेक्ट टकराते हैं, तो प्रोग्राम को अलग-अलग चीजें करने की आवश्यकता हो सकती है, जो अभी-अभी हिट हुई है।

बिल्ट-इन मल्टीपल डिस्पैच
वाली भाषाएं

सी #
C Sharp (प्रोग्रामिंग लैंग्वेज) | C# ने संस्करण 4 में डायनेमिक मल्टीमेथड्स के लिए समर्थन पेश किया (अप्रैल 2010) 'डायनामिक' कीवर्ड का उपयोग करते हुए। निम्न उदाहरण मल्टीमेथ्स प्रदर्शित करता है। कई अन्य वैधानिक रूप से टाइप की गई भाषाओं की तरह, C# भी स्टैटिक मेथड ओवरलोडिंग का समर्थन करता है। माइक्रोसॉफ्ट उम्मीद करता है कि अधिकांश परिदृश्यों में डेवलपर्स गतिशील टाइपिंग पर स्थिर टाइपिंग का चयन करेंगे। 'डायनामिक' कीवर्ड COM ऑब्जेक्ट्स और डायनामिक रूप से टाइप की गई .NET भाषाओं के साथ इंटरऑपरेबिलिटी का समर्थन करता है।

नीचे दिया गया उदाहरण C# 9 और C# 10 में पेश की गई सुविधाओं का उपयोग करता है।

<वाक्यविन्यास प्रकाश लैंग = सी #> स्टेटिक कोलाइडर लाइब्रेरी का उपयोग करना;

कंसोल.राइटलाइन (कोलाइड (नया क्षुद्रग्रह (101), नया अंतरिक्ष यान (300))); कंसोल.राइटलाइन (कोलाइड (नया क्षुद्रग्रह (10), नया अंतरिक्ष यान (10))); कंसोल.राइटलाइन (कोलाइड (नया स्पेसशिप (101), नया स्पेसशिप (10)));

स्ट्रिंग कोलाइड (स्पेसऑब्जेक्ट एक्स, स्पेसऑब्जेक्ट वाई) => x.साइज़> 100 && y.साइज़> 100 ? बड़ा उछाल! : CollideWith(x गतिशील के रूप में, y गतिशील के रूप में); // CollideWith विधि के लिए गतिशील प्रेषण

क्लास कोलाइडर लाइब्रेरी {   सार्वजनिक स्थैतिक स्ट्रिंग CollideWith(क्षुद्रग्रह x, क्षुद्रग्रह y) => a/a; सार्वजनिक स्थैतिक स्ट्रिंग CollideWith(क्षुद्रग्रह x, अंतरिक्ष यान y) => a/s; सार्वजनिक स्थैतिक स्ट्रिंग CollideWith(Spaceship x, Asteroid y) => s/a; सार्वजनिक स्थैतिक स्ट्रिंग CollideWith(Spaceship x, Spaceship y) => s/s ; }

सार रिकॉर्ड स्पेसऑब्जेक्ट (इंट साइज); रिकॉर्ड क्षुद्रग्रह (पूर्णांक आकार): स्पेसऑब्जेक्ट (आकार); रिकॉर्ड स्पेसशिप (इंट साइज): स्पेसऑब्जेक्ट (साइज); 

आउटपुट:

सिंटैक्सहाइलाइट लैंग = आउटपुट> बड़ा उछाल! जैसा एस/एस 

ग्रूवी
Apache Groovy एक सामान्य प्रयोजन जावा (प्रोग्रामिंग भाषा) संगत/इंटरयूजेबल जावा वर्चुअल मशीन भाषा है, जो जावा के विपरीत, लेट बाइंडिंग/मल्टीपल डिस्पैच का उपयोग करती है।

सामान्य लिस्प
कॉमन लिस्प जैसी कई डिस्पैच वाली भाषा में, यह इस तरह दिख सकती है (कॉमन लिस्प का उदाहरण दिखाया गया है):

और इसी तरह अन्य तरीकों के लिए। स्पष्ट परीक्षण और गतिशील कास्टिंग का उपयोग नहीं किया जाता है।

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

जूलिया
जूलिया (प्रोग्रामिंग लैंग्वेज) में बिल्ट-इन मल्टीपल डिस्पैच है, और यह भाषा डिजाइन के लिए केंद्रीय है। उपरोक्त उदाहरण का जूलिया संस्करण ऐसा दिखाई दे सकता है:

आउटपुट: <वाक्यविन्यास लैंग = जूलिया-रिप्ल> जूलिया> टकराना (क्षुद्रग्रह (101), अंतरिक्ष यान (300)) बड़ा उछाल!

जूलिया> टकराना (क्षुद्रग्रह (10), अंतरिक्ष यान (10)) जैसा

जूलिया> टकराना (स्पेसशिप (101), स्पेसशिप (10)) एस/एस 

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

इसमें मल्टीमेथ्स और मल्टीसब दोनों हैं। चूँकि अधिकांश ऑपरेटर सबरूटीन्स होते हैं, इसमें कई डिस्पैच ऑपरेटर्स भी होते हैं।

सामान्य प्रकार की बाधाओं के साथ-साथ, इसमें कहाँ की बाधाएँ भी होती हैं जो बहुत विशिष्ट सबरूटीन्स बनाने की अनुमति देती हैं।

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

जावास्क्रिप्ट में गतिशील रूप से टाइप किया गया संस्करण:

टाइपस्क्रिप्ट में स्टेटिकली टाइप किया गया संस्करण:

अजगर
लाइब्रेरी (कंप्यूटिंग) एक्सटेंशन का उपयोग करके पायथन (प्रोग्रामिंग भाषा) में एकाधिक प्रेषण जोड़ा जा सकता है। उदाहरण के लिए, मॉड्यूल multimethod.py का उपयोग करना और मॉड्यूल multimethods.py के साथ भी[एचटीटीपी://गनोसिस.कक्ष/डाउनलोड/गनोसिस/मैजिक/मुलतईमेथोडस.पी मल्टीमेथोड़स.पी], डेविड मर्ट्ज़, एट अल द्वारा कॉन्फ़िगर करने योग्य डिस्पैच रिज़ॉल्यूशन के साथ पायथन में एकाधिक प्रेषण।

कार्यात्मक रूप से, यह CLOS उदाहरण के समान है, लेकिन सिंटैक्स पारंपरिक पायथन है।

पायथन 2.4 पायथन सिंटैक्स और सिमेंटिक्स # डेकोरेटर्स का उपयोग करते हुए, गुइडो वैन रोसुम ने मल्टीमेथ्स का एक नमूना कार्यान्वयन तैयार किया एक सरलीकृत वाक्य रचना के साथ:

और फिर यह मल्टीमेथड डेकोरेटर को परिभाषित करता है।

PEAK-Rules पैकेज उपरोक्त उदाहरण के समान सिंटैक्स के साथ कई प्रेषण प्रदान करता है। इसे बाद में PyProtocols द्वारा बदल दिया गया। रेग पुस्तकालय भी एकाधिक और विधेय प्रेषण का समर्थन करता है। पायथन सिंटैक्स और शब्दार्थ # फ़ंक्शन एनोटेशन की शुरुआत के साथ, सरल सिंटैक्स के साथ कई प्रेषण संभव हैं। उदाहरण के लिए, प्लम-डिस्पैच का इस्तेमाल करके,

सी
C में डायनेमिक डिस्पैच नहीं है, इसलिए इसे किसी न किसी रूप में मैन्युअल रूप से लागू किया जाना चाहिए। किसी वस्तु के उपप्रकार की पहचान करने के लिए अक्सर एक एनम का उपयोग किया जाता है। समारोह सूचक शाखा तालिका में इस मान को देखकर गतिशील प्रेषण किया जा सकता है। यहाँ C में एक सरल उदाहरण है:

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

सी ++
, C++ मूल रूप से केवल एक प्रेषण का समर्थन करता है, हालांकि 2007 में Bjarne Stroustrup (और सहयोगियों) द्वारा बहु-विधियों (एकाधिक प्रेषण) को जोड़ने का प्रस्ताव दिया गया था। इस सीमा के आसपास काम करने के तरीके समान हैं: आगंतुक पैटर्न, डायनेमिक कास्ट या लाइब्रेरी का उपयोग करें:

या पॉइंटर-टू-मेथड लुकअप टेबल:

YOMM2 लाइब्रेरी ओपन मल्टीमेथड्स का तेज, ऑर्थोगोनल कार्यान्वयन प्रदान करता है।

खुले तरीकों को घोषित करने के लिए सिंटैक्स देशी सी ++ कार्यान्वयन के प्रस्ताव से प्रेरित है। लाइब्रेरी के लिए आवश्यक है कि उपयोगकर्ता आभासी तर्क (और उनके उप-वर्ग) के रूप में उपयोग की जाने वाली सभी कक्षाओं को पंजीकृत करे, लेकिन मौजूदा कोड में किसी भी संशोधन की आवश्यकता नहीं है। विधियों को सामान्य इनलाइन C++ फ़ंक्शंस के रूप में कार्यान्वित किया जाता है; उन्हें अतिभारित किया जा सकता है और उन्हें सूचक द्वारा पारित किया जा सकता है। आभासी तर्कों की संख्या की कोई सीमा नहीं है, और उन्हें मनमाने ढंग से गैर-आभासी तर्कों के साथ मिलाया जा सकता है।

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

क्षुद्रग्रह उदाहरण को निम्नानुसार लागू किया जा सकता है:

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

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

जावा
केवल एक प्रेषण वाली भाषा में, जैसे कि जावा (प्रोग्रामिंग भाषा), एकाधिक प्रेषण को एकल प्रेषण के कई स्तरों के साथ अनुकरण किया जा सकता है:



चलने का समय  एक या दोनों स्तरों पर जाँचों का भी उपयोग किया जा सकता है।

प्राथमिक प्रतिमान

 * जूलिया (प्रोग्रामिंग भाषा)

सामान्य मल्टीमेथ्स का समर्थन

 * सी शार्प 4.0 | सी # 4.0
 * सेसिल (प्रोग्रामिंग भाषा)
 * क्लोजर
 * कॉमन लिस्प (कॉमन लिस्प ऑब्जेक्ट सिस्टम के माध्यम से)
 * डायलन (प्रोग्रामिंग भाषा)
 * अमृत (प्रोग्रामिंग भाषा)
 * किले (प्रोग्रामिंग भाषा)
 * ग्रूवी (प्रोग्रामिंग भाषा)
 * कमंद (प्रोग्रामिंग भाषा)
 * निम (प्रोग्रामिंग भाषा), v0.19.x तक (v0.20.0 से कंपाइलर फ्लैग पास करना आवश्यक है)
 * राकू (प्रोग्रामिंग भाषा)
 * आर (प्रोग्रामिंग भाषा)
 * सही
 * तब
 * विजुअल बेसिक .नेट|वीबी.नेट लेट बाइंडिंग के माध्यम से, नेट डीएलआर के माध्यम से भी
 * वोल्फ्राम भाषा प्रतीकात्मक पैटर्न मिलान के माध्यम से
 * Xtend

एक्सटेंशन के माध्यम से

 * कोई भी .NET Framework|.NET भाषा (पुस्तकालय के माध्यम से MultiMethods.NET)
 * सी (प्रोग्रामिंग भाषा) (पुस्तकालय के माध्यम से C ऑब्जेक्ट सिस्टम)
 * सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # (लाइब्रेरी के माध्यम से multimethod-sharp)
 * C++ (पुस्तकालय के माध्यम से yomm2, multimethods और omm )
 * डी (प्रोग्रामिंग भाषा) (पुस्तकालय के माध्यम से openmethods)
 * कारक (प्रोग्रामिंग भाषा) (मानक के माध्यम से बहुविध शब्दावली)
 * जावा (प्रोग्रामिंग भाषा) (विस्तार MultiJava का प्रयोग करके)
 * जावास्क्रिप्ट (प्रोग्रामिंग भाषा) (पैकेज के माध्यम से @arrows/multimethod)
 * पर्ल (मॉड्यूल के माध्यम से Class::Multimethods)
 * पायथन (प्रोग्रामिंग भाषा) (के माध्यम से PEAK-Rules, telecommunity.com/ RuleDispatch, gnosis.magic.multimethods, [http:/ /sourceforge.net/projects/pymultimethods/ PyMultimethods],, या प्लम-डिस्पैच)
 * रैकेट (प्रोग्रामिंग भाषा) (के माध्यम से multimethod-lib)
 * रूबी (प्रोग्रामिंग भाषा) (लाइब्रेरी के माध्यम से मल्टीपल डिस्पैच लाइब्रेरी और मल्टीमेथोड पैकेज और [https:// rubygems.org/gems/vlx-multi/ Vlx-Multimethods पैकेज])
 * योजना (प्रोग्रामिंग भाषा) (उदाहरण के माध्यम से TinyCLOS)
 * टाइपप्रति (पैकेज के माध्यम से @arrows/multimethod)

यह भी देखें

 * विधेय प्रेषण