2011-09-27 117 views
0

我有一个包含公共事件(SomeEvent)的基类(让它为SomeBaseClass),我有一个派生类,我想在其中引发这个事件,但是我不能(!!)VS 2010说我(在派生类中的行:base.SomeEvent!= null)“事件'SomeBaseClass.SomeEvent'只能出现在+ =或 - =”的左侧。如果我在这个基础上取代它是没有意义的。派生类中基类的公共事件

+0

你可以显示你的事件定义和你如何设置它? –

+0

公共事件EventHandler StateChanged; – Vasya

回答

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

,你不喜欢它的原因这是因为事件只能从定义类中调用。