我有一个包含公共事件(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. 我可以在基类中修改派生类中的公共插槽的公共函数吗?
- 7. 从派生类中订阅基类事件
- 8. 事件在派生类
- 9. 派生类应该处理基类的事件吗? (C#/ WPF)
- 10. 从派生类到基类
- 11. 从基类INITIALISE派生类
- 12. XMLPull - 基类和派生类
- 13. C++ - 派生类到基类
- 14. 派生类通过基类
- 15. 基类和派生类
- 16. 基类中的访问派生类
- 17. 包中的基类和派生类
- 18. 模板化基类中的派生类
- 19. 公开从基类继承,从派生的类私有继承
- 20. 无法访问派生类中的公共变量
- 21. 派生类中的额外公共方法?
- 22. 如何隐藏派生类中的公共方法?
- 23. 从基类中识别派生类
- 24. 在派生类派生类到基类在PHP
- 25. 派生类的基指针
- 26. 派生类共享方法
- 27. IOS xamarin派生类中重写事件
- 28. 在基类和派生类中使用基类的装饰器
- 29. 基类内的派生类的大小
- 30. 检测基类的派生指向派生类
你可以显示你的事件定义和你如何设置它? –
公共事件EventHandler StateChanged; –
Vasya