28

मैं समझने की कोशिश कर रहा हूं कि एकल और एकाधिक प्रेषण वास्तव में क्या हैं।सी # एक एकल प्रेषण या एकाधिक प्रेषण भाषा है?

मैं सिर्फ इस पढ़ें:
http://en.wikipedia.org/wiki/Multiple_dispatch

और है कि परिभाषा से मुझे लगता है कि सी # और VB.Net बहु-प्रेषण कर रहे हैं, भले ही पसंद जिनमें से कॉल करने के लिए ओवरलोड संकलन समय पर किया जाता है ।

क्या मैं यहां सही हूं, या क्या मुझे कुछ याद आ रही है? धन्यवाद!

उत्तर

34

ठीक है, मैं सूक्ष्म अंतर को समझ गया जहां फ़ंक्शन अधिभार एकाधिक-प्रेषण से अलग है।

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

वह मामला जहां यह वास्तविक अंतर बनाता है, जब आपके पास पैरामीटर के प्रकार पर भिन्न विधि के 2 ओवरलोड होते हैं, लेकिन 2 प्रकार पॉलीमोर्फिक होते हैं, और आप उच्च प्रकार के रूप में घोषित संदर्भ के साथ कॉल करते हैं, कम प्रकार का ऑब्जेक्ट है ...

उदाहरण (किसी एक बेहतर तरीका यह व्यक्त करने के लिए के बारे में सोच सकते हैं, इस उत्तर को संपादित करने में संकोच न करें):

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip(theShip); 
} 

XWing जाहिर IRebelAllianceShip लागू करता है। इस मामले में, पहली विधि को बुलाया जाएगा, जबकि यदि सी # ने एकाधिक प्रेषण लागू किया है, तो दूसरी विधि को बुलाया जाएगा।

डॉक्टर रीहश के बारे में खेद है ... यह मुझे प्रत्येक प्रेषण विधि के लिए परिभाषाओं को पढ़ने के बजाय, इस अंतर को समझाने का सबसे स्पष्ट तरीका प्रतीत होता है।

अधिक औपचारिक स्पष्टीकरण के लिए: http://en.wikipedia.org/wiki/Double_dispatch#Double_dispatch_is_more_than_function_overloading

+0

यह प्रमुख अंतर का एक अच्छा उदाहरण है। –

+0

धन्यवाद! मुझे इस तरह का एक उदाहरण चाहिए। – John

+1

@ डैनियल मैग्लिओला, कृपया ध्यान दें कि डायनामिक प्रेषण अब गतिशील – RichardOD

5

सी # एकल प्रेषण है लेकिन कुछ ब्लॉग पोस्ट हैं जो उनके शीर्षक से दिखते हैं कि वे बहुआयामी अनुकरण करने की कोशिश कर रहे हैं। अगर मैं लोड करने के लिए लेखों में से एक प्राप्त कर सकता हूं तो मैं अपना जवाब यहां अपडेट कर दूंगा।

0

गोफ विज़िटर पैटर्न डबल प्रेषण कैसे करें इसका एक उदाहरण है। स्कॉट मेयर्स "अधिक प्रभावी सी ++" आपको दिखाता है कि इसे सी ++ में कैसे किया जाए। यहां डॉ। डॉब्स से link है जो जावा और सी ++ दोनों में डबल प्रेषण करने के तरीके के बारे में बात करता है।

2

सी # एकाधिक प्रेषण का समर्थन नहीं करता है। विज़िटर डिज़ाइन पैटर्न कुछ ऐसा अनुकरण करता है जिसे एकाधिक प्रेषण के रूप में वर्णित किया जा सकता है, भले ही विज़िटर पैटर्न मुख्य रूप से पदानुक्रम से अलग एल्गोरिदम पर केंद्रित हो।

1

cited Wikipedia article के अनुसार, कई प्रेषण, परिभाषा से, शामिल वस्तुओं की क्रम प्रकार पर आधारित है, इसलिए सी # और VB.net , उसका उपयोग नहीं करते क्योंकि निर्णय किया जाता है, जैसा कि आप राज्य, संकलन समय पर।

17

उन है कि इस लेख खोज इंजन का उपयोग खोजने के लिए, सी # 4.0 dynamic कीवर्ड परिचय देता है। कोड निम्न की तरह दिखेगा।

int CaptureSpaceShip(IRebelAllianceShip ship) {} 
int CaptureSpaceShip(XWing ship) {} 

void Main() { 
    IRebelAllianceShip theShip = new XWing(); 
    CaptureSpaceShip((dynamic)theShip); 
} 
+5

+1 । सी # 4.0 एकाधिक प्रेषण का समर्थन करता है। नीचे के संस्करण नहीं है – RichardOD

0

के लिए निम्नलिखित पर एक नज़र डालें हो सकता है कि किसी को कई प्रेषण के लिए डायनामिक कीवर्ड का उपयोग कर अच्छा सी # उदाहरण में दिलचस्पी होगी (MSDN blog)

विकिपीडिया का कहना है कि सी # 4.0 (गतिशील) "एकाधिक प्रेषण" भाषा है। मुझे यह भी लगता है कि जावा, सी # (4.0 से पहले) जैसी भाषाएं, सी ++ एकल प्रेषण हैं।

संबंधित मुद्दे