我有一個包含公共事件(SomeEvent)的基類(讓它爲SomeBaseClass),我有一個派生類,我想在其中引發這個事件,但是我不能(!!)VS 2010說我(在派生類中的行:base.SomeEvent!= null)「事件'SomeBaseClass.SomeEvent'只能出現在+ =或 - =」的左側。如果我在這個基礎上取代它是沒有意義的。派生類中基類的公共事件
0
A
回答
2
不,這是絕對正確的 - 事件是僅事件(與訂閱和退訂)儘可能派生類而言。如果您的基類想讓派生類提升事件,那麼它應該包含一個受保護的方法(例如,對於類型爲EventHandler
類型的名爲Foo
的事件,通常使用虛擬OnFoo(EventHandler)
)。請注意,如果你寫在C#像這樣的現場般的事件:
public event EventHandler Foo;
這實際上宣告私人場稱爲Foo
(這是類的嵌套類訪問)和公共事件(這隻包括訂閱/取消訂閱)。你可以聲明自己「定製」事件是這樣的:
protected EventHandler foo;
// Note: not thread-safe. Only present for demonstration purposes.
public event EventHandler Foo
{
add { foo += value; }
remove { foo -= value; }
}
,然後派生類將有機會獲得現場......但我不會建議。 (我很少申報非私有字段,比常數等。)
2
你需要做的正確的方式(即在C#中的慣用方式)
public class Base {
public event EventHandler<EventArgs> SomeEvent;
protected virtual void OnSomeEvent(EventArgs e) {
EventHandler<EventArgs> handler = SomeEvent;
if (handler != null) {
handler(this, e);
}
}
}
public class Derived {
protected virtual void OnSomeEvent(EventArgs e) {
// derived event handling here
// then invoke the base handler
base.OnSomeEvent(e);
}
}
,你不喜歡它的原因這是因爲事件只能從定義類中調用。
相關問題
- 1. 如何隱藏在派生類的基類的公共財產
- 2. 定義派生類時,爲什麼基類標記爲「公共」?
- 3. 如何從基類公開繼承,但是派生類中的基類有一些私有的公共方法?
- 4. 使用在基類派生類,而派生類的基類
- 5. 我可以在基類中修改派生類中的公共插槽的公共函數嗎?
- 6. 派生類應該處理基類的事件嗎? (C#/ WPF)
- 7. 基類和派生類
- 8. 從基類INITIALISE派生類
- 9. C++ - 派生類到基類
- 10. 模板化基類中的派生類
- 11. 包中的基類和派生類
- 12. 派生類中的額外公共方法?
- 13. 無法訪問派生類中的公共變量
- 14. 在派生類派生類到基類在PHP
- 15. 派生類共享方法
- 16. 在基類和派生類中使用基類的裝飾器
- 17. 基類內的派生類的大小
- 18. 檢測基類的派生指向派生類
- 19. 分配派生類的基類
- 20. 派生類使用基類的屬性?
- 21. 派生類訪問的基類 - 如何?
- 22. NHibernate的基類和派生類映射
- 23. 派生類的基類枚舉值?
- 24. weak_ptr的基類,而shared_ptr是派生類?
- 25. 在目標c中指派派生類的基類指針
- 26. 檢測公共基類
- 27. 在其派生類中共享的基類中的靜態成員
- 28. 爲什麼要將基類中的受保護訪問更改爲派生類中的公共訪問權限?
- 29. 訪問基類構件內派生
- 30. 基類中派生的實例
你可以顯示你的事件定義和你如何設置它? –
公共事件EventHandler StateChanged; –
Vasya