दिलचस्प पोस्ट
क्या कोई अजगर के सापेक्ष आयात को समझा सकता है? दोहराए जाने वाले पासवर्ड के लिए काइनी 2 फॉर्म मान्य है पायथन में एक फ़ाइल को कैसे ले जाए मैं एक घटना के लिए कई श्रोताओं को कैसे सेट कर सकता हूं? पृष्ठभूमि में एक ffmpeg प्रक्रिया चलाएं संसाधित प्रोसीस बनाम कोड में एसक्यूएल को रखने के पेशेवर और विपक्ष क्या हैं डिफ़ॉल्ट वर्ग वंशानुक्रम प्रवेश फ़ॉर्म को बटन पर क्लिक करते समय फॉर्म सबमिट किया जाता है यह कैसे से बचने के लिए? jquery, क्लास जोड़ें / निकालें जब विंडो की चौड़ाई बदलती है पुनरावर्तक हेडर या पाद लेख में नियंत्रण कैसे खोजें क्या JSON के लिए एक स्ट्रीमिंग एपीआई है? Http त्रुटि 503। सेवा अनुपलब्ध है JSchException: एल्गोरिथ्म विफलता विफल JavaFX तालिका दृश्य में बटन कैसे जोड़ें स्विफ्ट में काम नहीं कर रहे एनएसडीट टाइम इन्टरलावलजिस 1 9 70?

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

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

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 ') के बाईं ओर दिखाई दे सकता है

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

Solutions Collecting From Web of "सी #: एक विरासत घटना में वृद्धि"

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

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

 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); } }