C # दो शब्द जानता है, delegate
और event
। पहले वाले से शुरू करते हैं।
प्रतिनिधि
A delegate
एक विधि का संदर्भ है। जैसे आप एक उदाहरण के लिए एक संदर्भ बना सकते हैं:
MyClass instance = myFactory.GetInstance();
आप किसी प्रतिनिधि को विधि का संदर्भ बनाने के लिए उपयोग कर सकते हैं:
Action myMethod = myFactory.GetInstance;
अब जब आपके पास एक विधि का संदर्भ है, तो आप संदर्भ के माध्यम से विधि को कॉल कर सकते हैं:
MyClass instance = myMethod();
लेकिन तुम क्यों करोगे? आप myFactory.GetInstance()
सीधे कॉल भी कर सकते हैं। इस मामले में आप कर सकते हैं। हालाँकि, इस बारे में सोचने के लिए कई मामले हैं कि आप नहीं चाहते कि बाकी एप्लिकेशन को सीधे ज्ञान हो myFactory
या myFactory.GetInstance()
सीधे कॉल करना हो।
एक स्पष्ट एक अगर आप को बदलने के लिए सक्षम होना चाहते हैं है myFactory.GetInstance()
में myOfflineFakeFactory.GetInstance()
एक केंद्रीय स्थान (उर्फ से कारखाने विधि पैटर्न )।
फैक्टरी विधि पैटर्न
इसलिए, यदि आपके पास एक TheOtherClass
वर्ग है और उसे इसका उपयोग करने की आवश्यकता है myFactory.GetInstance()
, तो यह है कि प्रतिनिधि के बिना कोड कैसा दिखेगा (आपको अपने TheOtherClass
प्रकार के बारे में बताने की आवश्यकता होगी myFactory
):
TheOtherClass toc;
//...
toc.SetFactory(myFactory);
class TheOtherClass
{
public void SetFactory(MyFactory factory)
{
// set here
}
}
यदि आप प्रतिनिधियों का उपयोग करेंगे, तो आपको मेरे कारखाने के प्रकार को उजागर करने की आवश्यकता नहीं है:
TheOtherClass toc;
//...
Action factoryMethod = myFactory.GetInstance;
toc.SetFactoryMethod(factoryMethod);
class TheOtherClass
{
public void SetFactoryMethod(Action factoryMethod)
{
// set here
}
}
इस प्रकार, आप अपने प्रकार को उजागर किए बिना, किसी अन्य वर्ग को उपयोग करने के लिए एक प्रतिनिधि दे सकते हैं। केवल एक चीज जो आप उजागर कर रहे हैं, वह है आपके तरीके का हस्ताक्षर (आपके पास कितने पैरामीटर हैं और ऐसे)।
"मेरी पद्धति का हस्ताक्षर", मैंने पहले कहां सुना था? ओ हाँ, इंटरफेस !!! इंटरफेस एक पूरे वर्ग के हस्ताक्षर का वर्णन करते हैं। केवल एक विधि के हस्ताक्षर का वर्णन करने के रूप में प्रतिनिधियों के बारे में सोचो!
एक इंटरफ़ेस और एक प्रतिनिधि के बीच एक और बड़ा अंतर यह है कि जब आप अपनी कक्षा को लिख रहे होते हैं, तो आपको C # "इस पद्धति को उस प्रकार के प्रतिनिधि को लागू करने की आवश्यकता नहीं होती है"। इंटरफेस के साथ, आपको यह कहने की ज़रूरत है कि "यह क्लास एक इंटरफ़ेस का प्रकार लागू करता है"।
इसके अलावा, एक प्रतिनिधि संदर्भ (कुछ प्रतिबंधों के साथ, नीचे देख सकते हैं) संदर्भ कई तरीकों (बुलाया MulticastDelegate
)। इसका मतलब यह है कि जब आप प्रतिनिधि को बुलाते हैं, तो कई स्पष्ट रूप से संलग्न तरीकों को निष्पादित किया जाएगा। एक वस्तु संदर्भ हमेशा केवल एक वस्तु के संदर्भ में हो सकता है।
एक के लिए प्रतिबंध MulticastDelegate
कि (विधि / प्रतिनिधि) हस्ताक्षर किसी भी वापसी मान (नहीं होना चाहिए रहे हैं void
) और कीवर्ड्स out
और ref
हस्ताक्षर में नहीं किया जाता है। जाहिर है, आप दो तरीकों को कॉल नहीं कर सकते हैं जो एक नंबर लौटाते हैं और उनसे उसी नंबर को वापस करने की अपेक्षा करते हैं। हस्ताक्षर के अनुपालन के बाद, प्रतिनिधि स्वचालित रूप से एक है MulticastDelegate
।
प्रतिस्पर्धा
घटनाएँ सिर्फ गुण हैं (जैसे; सेट; गुण उदाहरण क्षेत्रों के लिए) जो अन्य वस्तुओं से प्रतिनिधि को सदस्यता को उजागर करते हैं। हालांकि, इन गुणों का समर्थन नहीं मिलता है; इसके बजाय, वे जोड़ने का समर्थन करते हैं; हटाना;
तो आपके पास हो सकता है:
Action myField;
public event Action MyProperty
{
add { myField += value; }
remove { myField -= value; }
}
UI में उपयोग (WinForms, WPF, UWP इत्यादि)
तो, अब हम जानते हैं कि एक प्रतिनिधि एक विधि का एक संदर्भ है और हमें दुनिया को यह बताने के लिए एक घटना हो सकती है कि वे हमें हमारे प्रतिनिधि से संदर्भित होने के लिए अपने तरीके दे सकते हैं, और हम एक यूआई बटन हैं, फिर: हम किसी से भी पूछ सकते हैं कि क्या मुझे क्लिक करने में दिलचस्पी है, हमारे साथ अपनी विधि दर्ज करने के लिए (जिस घटना को हमने उजागर किया है)। हम उन सभी तरीकों का उपयोग कर सकते हैं जो हमें दिए गए थे और हमारे प्रतिनिधि द्वारा उनका संदर्भ दिया गया था। और फिर, हम प्रतीक्षा करेंगे और प्रतीक्षा करेंगे .... जब तक कोई उपयोगकर्ता नहीं आता है और उस बटन पर क्लिक करता है, तब तक हमारे पास प्रतिनिधि को आमंत्रित करने के लिए पर्याप्त कारण होगा। और क्योंकि प्रतिनिधि हमें दिए गए उन सभी तरीकों का संदर्भ देते हैं, उन सभी तरीकों को लागू किया जाएगा। हमें नहीं पता कि वे तरीके क्या करते हैं, और न ही हमें पता है कि कौन सी कक्षा उन तरीकों को लागू करती है। हम सभी इस बात की परवाह करते हैं कि किसी को क्लिक करने में हमारी दिलचस्पी थी,
जावा
जावा जैसी भाषाओं में प्रतिनिधि नहीं हैं। वे इसके बजाय इंटरफेस का उपयोग करते हैं। जिस तरह से वे करते हैं कि किसी को भी, जो 'हमें क्लिक किया जा रहा है' में रूचि है, एक निश्चित इंटरफ़ेस को लागू करने के लिए (एक निश्चित विधि जिसे हम कॉल कर सकते हैं) को लागू करने के लिए है, फिर हमें संपूर्ण उदाहरण दें जो इंटरफ़ेस को लागू करता है। हम इस इंटरफ़ेस को लागू करने वाली सभी वस्तुओं की एक सूची रखते हैं और जब भी हम क्लिक करते हैं, तो उनकी 'निश्चित विधि जिसे हम कॉल कर सकते हैं' कह सकते हैं।