派生类中基类的公共事件

时间:2011-09-27 06:08:01

标签: c# .net

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

2 个答案:

答案 0 :(得分:2)

不,这是绝对正确的 - 就导出类而言,事件只是 一个事件(有订阅和取消订阅)。如果您的基类想要让派生类引发事件,那么它应该包含一个受保护的方法(对于名为OnFoo(EventHandler)Foo类型的事件,通常为虚拟EventHandler,例)。请注意,如果您在C#中编写类似字段的事件,请执行以下操作:

public event EventHandler Foo;

实际上,它声明了一个名为Foo私有字段(该类和任何嵌套类可以访问该字段)和一个公共事件(仅包含subscribe / unsubscribe)。您可以声明自己的“自定义”事件:

protected EventHandler foo;
// Note: not thread-safe. Only present for demonstration purposes.
public event EventHandler Foo
{
    add { foo += value; }
    remove { foo -= value; }
}

然后派生类可以访问该字段......但我不建议这样做。 (除了常量之外,我很少声明非私有字段。)

答案 1 :(得分: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);
    }
}

你这样做的原因是因为事件只能在定义类中调用。