दिलचस्प पोस्ट
एक वेबपेज का काम स्थानीय प्रति डाउनलोड करें जावा: तिथि से महीना पूर्णांक प्राप्त करें जावास्क्रिप्ट या jQuery ब्राउज़र बैक बटन क्लिक डिटेक्टर PHP में, क्या आप एक ऑब्जेक्ट इन्स्तांत कर सकते हैं और उसी लाइन पर एक विधि कॉल कर सकते हैं? विरासत के बिना बहुरूपता संभव है? IPhone 5 स्क्रीन रिज़ॉल्यूशन के लिए ऐप्स को कैसे विकसित या माइग्रेट करें? कैसे जांचने के लिए कि क्या mod_rewrite सर्वर पर सक्षम है? केवल एक टेक्स्ट बॉक्स में टाइप किए जाने की अनुमति दें मॉडल में वर्तमान_उज़र एक्सेस करें एक ASMX फ़ाइल आउटपुट JSON को कैसे जाने दें कोई एक प्रोफाइलर का उपयोग कर सकता है, लेकिन क्यों न केवल प्रोग्राम को रोकें? कोणीय 2 सेवा से अवलोकन योग्य बनाना और वापस करना JSF परियोजना में <welcome-file> के माध्यम से डिफ़ॉल्ट होम पेज सेट करें पार्सर, दुभाषिए, और संकलक पर सीखने के संसाधन इंटरफ़ेस के तरीकों में से एक की घोषणा / कार्यान्वयन एक इंटरफ़ेस को लागू करने के लिए एक अमूर्त वर्ग क्यों हो सकता है?

सी #: एक विरासत घटना में वृद्धि

मेरे पास एक बेस क्लास है जिसमें निम्न इवेंट हैं:

public event EventHandler Loading; public event EventHandler Finished; 

इस आधार वर्ग से मिलने वाले वर्ग में, मैं घटना को बढ़ाने की कोशिश करता हूं:

 this.Loading(this, new EventHandler()); // All we care about is which object is loading. 

मुझे निम्न त्रुटि मिली:

घटना 'BaseClass.Loading' केवल + = या – = (BaseClass ') के बाईं ओर दिखाई दे सकता है

मैं मान रहा हूं कि मैं इन घटनाओं को दूसरे विरासत के सदस्यों के समान नहीं देख सकता हूं?

वेब के समाधान से एकत्रित समाधान "सी #: एक विरासत घटना में वृद्धि"

आपको क्या करना है, यह है:

आपके बेस क्लास में (जहां आपने इवेंट्स घोषित की है), सुरक्षित तरीके तैयार करें, जो इवेंट्स को बढ़ाने के लिए उपयोग किए जा सकते हैं:

 public class MyClass { public event EventHandler Loading; public event EventHandler Finished; protected virtual void OnLoading(EventArgs e) { EventHandler handler = Loading; if( handler != null ) { handler(this, e); } } protected virtual void OnFinished(EventArgs e) { EventHandler handler = Finished; if( handler != null ) { handler(this, e); } } } 

(ध्यान दें कि आपको संभावित रूप से उन तरीकों को बदलना चाहिए, यह जांचने के लिए कि क्या आपको इवेंटहोल्डर को शामिल करना है या नहीं)।

फिर, कक्षाओं में जो इस आधार वर्ग से उत्तराधिकारी होते हैं, आप इवेंट्स बढ़ाने के लिए केवल ऑन-फिनिश्ड या ऑनलोडिंग विधियों को कॉल कर सकते हैं:

 public AnotherClass : MyClass { public void DoSomeStuff() { ... OnLoading(EventArgs.Empty); ... OnFinished(EventArgs.Empty); } } 

आप केवल घोषणा वर्ग में एक इवेंट तक पहुंच सकते हैं, जैसा कि .NET उन दृश्यों के पीछे निजी इंस्टेंस वेरिएबल बनाता है जो वास्तव में प्रतिनिधि को पकड़ते हैं। यह कर रहा हूं..

 public event EventHandler MyPropertyChanged; 

वास्तव में यह कर रहा है;

 private EventHandler myPropertyChangedDelegate; public event EventHandler MyPropertyChanged { add { myPropertyChangedDelegate += value; } remove { myPropertyChangedDelegate -= value; } } 

और यह कर रहा है …

 MyPropertyChanged(this, EventArgs.Empty); 

वास्तव में यह है …

 myPropertyChangedDelegate(this, EventArgs.Empty); 

तो आप (स्पष्टतः) केवल घोषित वर्ग के भीतर से निजी प्रतिनिधि उदाहरण चर तक पहुंच सकते हैं।

सम्मेलन को घोषित वर्ग में ऐसा कुछ प्रदान करना है ..

 protected virtual void OnMyPropertyChanged(EventArgs e) { EventHandler invoker = MyPropertyChanged; if(invoker != null) invoker(this, e); } 

आप तब उस क्लास में कहीं से या ईवेंट का आह्वान करने के लिए विरासत के उत्तराधिकार के नीचे से OnMyPropertyChanged(EventArgs.Empty) को कॉल कर सकते हैं।

मैं मान रहा हूं कि मैं इन घटनाओं को दूसरे विरासत के सदस्यों के समान नहीं देख सकता हूं?

ठीक। यह विरासत में मिली कक्षाओं से ऊपर उठाने के लिए बेस क्लास में प्रत्येक ईवेंट के लिए एक सुरक्षित फ़ंक्शन OnXyz या RaiseXyz प्रदान करने के लिए प्रथागत है। उदाहरण के लिए:

 public event EventHandler Loading; protected virtual void OnLoading() { EventHandler handler = Loading; if (handler != null) handler(this, EventArgs.Empty); } 

विरासत कक्षा में बुलाया गया:

 OnLoading(); 

आप इस तरह से कोशिश कर सकते हैं, यह मेरे लिए काम करता है:

 public delegate void MyEventHaldler(object sender, EventArgs e); public class B { public virtual event MyEventHaldler MyEvent; protected override void OnChanged(EventArgs e) { if (MyEvent != null) MyEvent(this, e); } } public class D : B { public override event MyEventHaldler MyEvent; protected override void OnChanged(EventArgs e) { if (MyEvent != null) MyEvent(this, e); } }