2009-05-14 12 views
13

क्या कोई तरीका है कि मैं एक मौजूदा प्रतिनिधि के आधार पर एक नया प्रतिनिधि प्रकार बना सकता हूं? मेरे मामले में, मैं एक प्रतिनिधि MyMouseEventDelegate बनाना चाहता हूं जिसमें EventHandler<MouseEventArgs> जैसी ही कार्यक्षमता होगी।मैं सी # में किसी मौजूदा प्रतिनिधि के आधार पर एक नया प्रतिनिधि प्रकार कैसे बना सकता हूं?

मुझे यह क्यों चाहिए? संकलन-समय टाइप-चेकिंग का लाभ उठाने के लिए! इस तरह, मेरे पास दो अलग-अलग प्रतिनिधि हो सकते हैं: MyRightClickHandler और MyLeftClickHandler, और कभी भी दो भ्रमित नहीं होंगे - भले ही वे दोनों EventHandler<MouseEventArgs> पर समान रूप से समान हों।

क्या इस तरह की चीज करने के लिए वाक्यविन्यास है?

ओह, और कोड की तरह:

using MyRightClickHandler = EventHandler<MouseEventArgs> 

काफी अच्छा नहीं है। यह किसी भी प्रकार की जांच नहीं करता है, क्योंकि यह वास्तव में एक नया प्रकार नहीं बनाता है। और मुझे ऐसी कोड को प्रत्येक कोड फ़ाइल में पेस्ट करना होगा जिसमें मैं MyRightClickHandler का उल्लेख करूंगा।

+1

मैंने यह स्पष्ट करने के लिए शीर्षक में संशोधन किया है कि आप प्रतिनिधि प्रकारों के बारे में बात नहीं कर रहे हैं, प्रतिनिधि उदाहरण नहीं। आशा है कि आपको बुरा लगेगा। –

+0

सम्मानित! धन्यवाद। – scraimer

उत्तर

10

ठीक है, यह मूल से प्रतिनिधि घोषणा की प्रतिलिपि बनाने जितना आसान है। वहाँ सी # में कुछ भी नहीं स्वचालित रूप से ऐसा करने के लिए है, लेकिन मैं यह एक बोझ की तरह है नहीं देख सकते हैं:

public delegate void MyLeftClickHandler(object sender, MouseEventArgs e); 
public delegate void MyRightClickHandler(object sender, MouseEventArgs e); 

यह की तरह नहीं है MouseEventHandler किसी भी समय जल्दी ही बदलने के लिए जा रहा है ...

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

+0

वाह। मुझे लगता है कि मुझे अगली बार बेहतर सामान्य ज्ञान का उपयोग करना चाहिए और उपयोग करना चाहिए :-) – scraimer

+0

यह बोझ नहीं है लेकिन यह प्रतिनिधियों पर बहुलकवाद की अनुमति नहीं देता है। –

5

मैं केवल संकलन समय प्रकार की जांच प्राप्त करना चाहता हूं, मुझे लगता है कि आपके द्वारा वर्णित मामलों के लिए विशेष EventArgs कक्षाएं बनाने के लिए पर्याप्त होगा। इस तरह आप अभी भी पूर्व निर्धारित प्रतिनिधियों का लाभ ले सकते:

class RightMouseButtonEventArgs : MouseEventArgs {} 
class LeftMouseButtonEventArgs : MouseEventArgs {} 

EventHandler<RightMouseButtonEventArgs> 
EventHandler<LeftMouseButtonEventArgs> 
4

सं C# documentation के अनुसार, प्रतिनिधि प्रकार सील कर रहे हैं, और आप एक नया प्रतिनिधि प्रकार है कि पहले से मौजूद किसी से विरासत नहीं बना सकते।

3

मुझे jon-skeet पर विश्वास नहीं था। मुझे इसे अपने लिए कोशिश करनी पड़ी। वह सही था।

public void F(object sender, MouseEventArgs e) {}; 
public MyLeftClickHandler l; 
public MyRightClickHandler r; 
public void Test() 
{ 
    l = F; // Automatically converted. 
    r = F; // Automatically converted to a different type. 
    l = r; // Syntax error. Incompatible types. 
    l = new MyLeftClickHandler(r); // Explicit conversion works. 
} 

स्पष्ट नहीं था कि!

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