我有一个包含公共事件(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