मैं प्रतिनिधियों का उपयोग कहां करूं? [बन्द है]


109

कुछ वास्तविक विश्व स्थान क्या हैं जो प्रतिनिधियों को बुलाते हैं? मैं उत्सुक हूं कि ऐसी कौन सी परिस्थितियां या पैटर्न मौजूद हैं जहां यह विधि सबसे अच्छा समाधान है। कोई कोड की आवश्यकता है।

जवाबों:


33

एक प्रतिनिधि एक नामित प्रकार है जो एक विशेष प्रकार की विधि को परिभाषित करता है। जिस प्रकार एक वर्ग परिभाषा दी गई वस्तु को परिभाषित करने के लिए सभी सदस्यों को देती है, उसी तरह की विधि को परिभाषित करने के लिए प्रतिनिधि हस्ताक्षर विधि हस्ताक्षर करता है।

इस कथन के आधार पर, एक प्रतिनिधि एक फ़ंक्शन पॉइंटर है और यह परिभाषित करता है कि वह फ़ंक्शन कैसा दिखता है।

एक प्रतिनिधि के एक वास्तविक दुनिया के आवेदन के लिए एक महान उदाहरण है विधेय । लिंक से उदाहरण में, आप देखेंगे कि Array.Find खोज करने के लिए सरणी लेता है और फिर जो ढूंढना है उसके मानदंड को संभालने के लिए एक विधेय। इस मामले में यह एक विधि ProductGT10 से गुजरता है जो कि प्रेडिकेट हस्ताक्षर से मेल खाता है।


154

जैसा कि "लर्निंग C # 3.0: में कहा गया है, C # 3.0 के मूल सिद्धांत"

सामान्य दृश्य: जब किसी राज्य का मुखिया मर जाता है, तो संयुक्त राज्य अमेरिका के राष्ट्रपति के पास आम तौर पर अंतिम संस्कार में शामिल होने का समय नहीं होता है। इसके बजाय, वह एक प्रतिनिधि को भेजता है। अक्सर यह प्रतिनिधि उपराष्ट्रपति होता है, लेकिन कभी-कभी VP अनुपलब्ध होता है और राष्ट्रपति को किसी और को, जैसे राज्य सचिव या यहाँ तक कि प्रथम महिला को भेजना चाहिए। वह किसी एक व्यक्ति को उसके प्रतिनिधि प्राधिकारी को "कठोर" नहीं करना चाहता है; वह इस जिम्मेदारी को किसी को सौंप सकता है जो सही अंतरराष्ट्रीय प्रोटोकॉल को निष्पादित करने में सक्षम है।

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

प्रोग्रामिंग परिदृश्य में: आपको अक्सर उन परिस्थितियों का सामना करना पड़ता है जहां आपको किसी विशेष कार्रवाई को निष्पादित करने की आवश्यकता होती है, लेकिन आप पहले से नहीं जानते हैं कि किस विधि, या यहां तक ​​कि किस वस्तु पर आप इसे निष्पादित करना चाहते हैं।

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


1
अनाम कार्यों / लैंबडास का उपयोग क्यों नहीं किया जाता है?
पचेरियर

5
@Pacerier यह एक देर से प्रतिक्रिया है और आपने इसका उत्तर खोज लिया होगा, लेकिन अन्य पाठकों के लिए जो इसे खोजते हैं: एक अनाम फ़ंक्शन एक प्रकार का प्रतिनिधि है।
एंथनी

10
@ एंथनी + पेसरियर: एक अनोखा तरीका एक प्रतिनिधि नहीं है। एक अनाम विधि कोड का एक टुकड़ा है। एक प्रतिनिधि एक सूचक है जो कोड के उस टुकड़े को इंगित करता है। आपके पास यह इंगित करने के लिए एक प्रतिनिधि के बिना एक anoymous विधि नहीं हो सकती है, अन्यथा इसे कभी नहीं कहा जाएगा। एक लैम्ब्डा एक ऑपरेटर है, जिसका इस्तेमाल लैम्ब्डा एक्सप्रेशन बनाने के लिए किया जाता है। लैम्ब्डा के भावों में ज्यादातर ऐय्याश विधियां होती हैं जो एक ... प्रतिनिधि के द्वारा इंगित की जाएंगी।
मार्टिन मुल्डर

मुझे मूर्खतापूर्ण, लेकिन अगर मैं बटन दबाया जाता था तो मुझे इसका उपयोग नहीं पता था, तो मैं एक इल्सेफ़ बयान बनाऊंगा। मैंने कहा मूर्खतापूर्ण।
जस्टजॉन

@Pacerier गुमनाम विधि C # 2.0 में प्रस्तुत की गई और लैंबडा ने C # 3.0 में पेश किया यदि लाम्बडा ने पहली बार पेश किया, तो कभी भी गुमनाम तरीके और यहां तक ​​कि प्रतिनिधि नहीं होते!
अमीनम

18

जेनेरिक सूचियों के प्रतिनिधियों का एक सामान्य उपयोग एक्शन प्रतिनिधियों (या इसके अनाम समकक्ष) के माध्यम से एक-लाइन परिचालन के लिए एक लाइन बनाने के लिए है:

myList.Foreach( i => i.DoSomething());

मैं एक सूची की खोज या छंटाई करने में प्रैडिकेट प्रतिनिधि को काफी उपयोगी मानता हूं:

myList.FindAll( i => i.Name == "Bob");    
myList.RemoveAll( i => i.Name == "Bob");

मुझे पता है कि आपने कोई कोड आवश्यक नहीं कहा है, लेकिन मुझे कोड के माध्यम से इसकी उपयोगिता व्यक्त करना आसान लगता है। :)


13

इवेंट हैंडलर से बाइंडिंग इवेंट्स आमतौर पर डेलिगेट्स के लिए आपका पहला परिचय होता है ... आप शायद यह भी नहीं जानते होंगे कि आप उनका इस्तेमाल कर रहे थे क्योंकि प्रतिनिधि इवेंटहैंडलर क्लास में लिपटे हुए हैं।


5

यदि आप यह देखने में रुचि रखते हैं कि वास्तविक दुनिया कोड में डेलिगेट पैटर्न का उपयोग कैसे किया जाता है, तो मैक ओएस एक्स पर कोको से आगे नहीं देखें। कोको मैक ओएस एक्स के तहत प्रोग्रामिंग के लिए ऐप्पल का पसंदीदा UI टूलकिट है, और ऑब्जेक्टिव सी में कोडित है। डिज़ाइन किया गया है ताकि प्रत्येक UI घटक को उपवर्ग या अन्य साधनों के बजाय प्रतिनिधिमंडल के माध्यम से बढ़ाया जा सके।

अधिक जानकारी के लिए, मैं यह जांचने की सलाह देता हूं कि यहां प्रतिनिधियों के बारे में एप्पल का क्या कहना है


5

मेरे पास एक प्रोजेक्ट था जिसमें win32 पायथन का इस्तेमाल किया गया था।

विभिन्न कारणों के कारण, कुछ मॉड्यूल ने DB, और अन्य मॉड्यूल - pyodbc.py का उपयोग करने के लिए odbc.py का उपयोग किया।

एक समस्या थी जब दोनों प्रकार के मॉड्यूल द्वारा एक फ़ंक्शन का उपयोग करने की आवश्यकता थी। इसमें एक तर्क के रूप में एक कनेक्शन ऑब्जेक्ट पास किया गया था, लेकिन फिर यह जानना था कि समय का प्रतिनिधित्व करने के लिए dbi.dbiDate या डेटाइम का उपयोग करना है या नहीं।

ऐसा इसलिए था क्योंकि SQL स्टेटमेंट में ओडब्लूसीएचडी को मान दिया गया था, dbi.dbiDate के रूप में दिनांक जबकि pyodbc.py ने डेटाइम मानों की अपेक्षा की थी।

एक और जटिलता यह थी कि odbc.py और pyodbc.py द्वारा बनाई गई कनेक्शन ऑब्जेक्ट ने अतिरिक्त फ़ील्ड सेट करने की अनुमति नहीं दी थी।

मेरा समाधान एक प्रतिनिधि वर्ग द्वारा odbc.odbc (...) और pyodbc.pyodbc (...) द्वारा लौटाए गए कनेक्शन ऑब्जेक्ट्स को लपेटना था, जिसमें एक अतिरिक्त फ़ील्ड के मान के रूप में वांछित समय प्रतिनिधित्व फ़ंक्शन शामिल है, और जो प्रतिनिधियों को मूल कनेक्शन ऑब्जेक्ट के लिए अन्य सभी फ़ील्ड अनुरोध।


5

मेरे पास आपके जैसा ही सवाल था और जवाब के लिए इस साइट पर गया।

जाहिरा तौर पर, मैंने इस धागे पर उदाहरणों के माध्यम से स्किम्ड करते हुए भी इसे बेहतर नहीं समझा।

मुझे अब पढ़े जाने वाले प्रतिनिधियों के लिए एक महान उपयोग मिला: http://www.c-sharpcorner.com/UploadFile/thiagu304/passdata05172006234318PM/passdata.aspx

नए उपयोगकर्ताओं के लिए यह अधिक स्पष्ट प्रतीत हो सकता है क्योंकि प्रपत्र POST / GET (QueryString) के साथ ASP.NET वेबसाइटों की तुलना में मानों को पारित करने के लिए बहुत अधिक जटिल हैं।

मूल रूप से आप एक प्रतिनिधि को परिभाषित करते हैं जो पैरामीटर के रूप में "टेक्स्टबॉक्स पाठ " लेता है ।

// फॉर्म 1

// Class Property Definition
public delegate void delPassData(TextBox text);


// Click Handler
private void btnSend_Click(object sender, System.EventArgs e)
{
     Form2 frm= new Form2();
     delPassData del=new delPassData(frm.funData);
     del(this.textBox1);
     frm.Show();
}

// सारांश: प्रतिनिधि को परिभाषित करें, नए फॉर्म 2 वर्ग को त्वरित करें, सौंपने के लिए funData () फ़ंक्शन असाइन करें, प्रतिनिधि को अपने टेक्स्टबॉक्स में पास करें। रूप दिखाओ।

// फॉर्म 2

public void passData(TextBox txtForm1)
{

     label1.Text = txtForm1.Text;
}

// सारांश: बस टेक्स्टबॉक्स txtForm1 को पैरामीटर के रूप में लें (जैसा कि आपके प्रतिनिधि में परिभाषित किया गया है) और टेक्स्टबॉक्स के पाठ पर लेबल टेक्स्ट असाइन करें।

मुझे आशा है कि यह प्रतिनिधियों पर कुछ उपयोग को उजागर करता है :) ।।


या तो Form2 वर्ग विधि को funData (passData के बजाय) नाम दिया जाना चाहिए, या Form1 फ़ंक्शन असाइनमेंट को frm.passData (frm.funData के बजाय) नाम देने की आवश्यकता है।
एथन

1

इस http://en.wikipedia.org/wiki/Delegation_pattern के साथ एक त्वरित Google खोज सामने आई । मूल रूप से, कभी भी जब आप किसी ऐसी वस्तु का उपयोग करते हैं जो आगे किसी अन्य वस्तु को कहती है तो आप उसे सौंप रहे हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.