2010-02-17 12 views
8

मान लें कि मेरे पास एक "प्रोसेसर" इंटरफेस है जो एक ईवेंट - ऑनप्रोसेस का खुलासा करता है। आम तौर पर कार्यान्वयन प्रसंस्करण करते हैं। इस प्रकार मैं इस घटना पर सुरक्षित रूप से सदस्यता ले सकता हूं और सुनिश्चित कर सकता हूं कि इसे निकाल दिया जाएगा। लेकिन एक प्रोसेसर प्रसंस्करण नहीं करता है - इस प्रकार मैं ग्राहकों को इस पर सब्सक्राइब करना चाहता हूं। क्या मै वह कर सकता हूं? नीचे दिए गए कोड में दूसरे शब्दों में मैं अंतिम पंक्ति एक अपवाद फेंक करना चाहते हैं:.NET ईवेंट - किसी ईवेंट पर सब्सक्राइब करने से ग्राहकों को अवरुद्ध करना

var emptyProcessor = new EmptyProcessor(); 
emptyProcessor.OnProcess += event_handler; // This line should throw an exception. 
+0

कल्पना कीजिए कि आप यह पता लगाने के लिए असाइन किए गए व्यक्ति थे कि कोड क्रैश क्यों होता है। क्या आप इस लाइन में त्रुटि की तलाश करेंगे? –

उत्तर

8
class EmptyProcessor : IProcessor { 

    [Obsolete("EmptyProcessor.OnProcess should not be directly accessed", true)] 
    public event EventHandler OnProcess { 
     add { throw new NotImplementedException(" :("); } 
     remove { } 
    } 
} 

इस स्थिति में, अप्रचलित पर true पैरामीटर एक संकलन समय अपवाद का कारण बनता है। इसलिए:

EmptyProcessor processor1 = new EmptyProcessor(); 
IProcessor processor2 = new EmptyProcessor(); 

processor1.OnProcess += handler; // <-- compile-time error 
processor2.OnProcess += handler; // <-- run-time error 
+0

आपको बहुत धन्यवाद – Moshe

+0

वाह ... मुझे यह भी नहीं पता था कि आप ऐसा कर सकते हैं। मैंने अभी परीक्षण करने के लिए एक त्वरित नमूना आवेदन लिखा है, और कौन जानता था ... यह काम किया। बहुत ही रोचक। – Nick

+0

+1, हालांकि मुझे यकीन नहीं है कि यह अपवाद संदेश बहुत उपयोगी होगा;) –

0

आप इसे कस्टम के साथ add/remove तरीकों को लागू कर सकते हैं, लेकिन मेरा मानना ​​है कि यह एक बुरा व्यवहार है।

देखो, तो आप एक इंटरफ़ेस, एक अनुबंध विभिन्न वर्गों द्वारा कार्यान्वित किया जाना है।
OnProcess इस अनुबंध का हिस्सा है और किसी भी तरह से विशेष नहीं है।

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

IProcessor proc = GetProcessorAnyhow(); 
proc.DoSomething(); 

संकलन प्रकार पर ठोस प्रकार को जानने के बिना।

हालांकि, अपने दृष्टिकोण के साथ,

IProcessor proc = GetProcessorAnyhow(); 
proc.OnProcess += (sender, e) => { }; 

, कोई स्पष्ट कारण के बिना विफल हो सकता है, हालांकि यह पूरी तरह से वैध कोड की तरह दिखता है।
Always make sure that wrong code looks wrong

आप नीचे दिए गए डिजाइन गलतियों में से एक किया है हो सकता है:

  • में IProcessorजबकि यह नहीं हो सकता है रखो OnProcess प्रत्येक प्रोसेसर का अनुबंध;
  • मेड EmptyProcessorIProcessor लागू करें, जबकि वास्तव में यह अनुबंध को संतुष्ट नहीं कर सकता है।
संबंधित मुद्दे