在派生的抽象类中实现事件的实现

时间:2010-10-04 16:24:32

标签: c# events interface delegates abstract

我正在尝试创建我正在考虑的翻译类,以便我的程序可以与各种目标平台对话。每个平台都将由抽象类的单独实现处理。为了简单起见,我已经减少了一些事情。

我有一个抽象类,有几个抽象方法:

abstract class ControllerBase
{
    public abstract bool EnableDTMFDetection(string CallID, Party Party);
    public abstract bool DisableDTMFDetection(string CallID, Party Party);
}

随后是一个派生自ControllerBase的类(类),并完全实现这些方法:

class PlatformOne : ControllerBase
{
    public override bool EnableDTMFDetection(string CallID, Party Party)
    {
        // Do Stuff
        return true;
    }

    public override bool DisableDTMFDetection(string CallID, Party Party)
    {
        // Do Stuff
        return true;
    }
}

到目前为止一切顺利。对于PlatformOne,我被迫定义每个方法,规定如何将传出消息发送到目标平台。

是我的传入事件。我需要能够从派生类中引发事件。当我将以下内容添加到controllerbase时:

    public delegate void MyEventHandler(object sender, EventArgs e);
    public event MyEventHandler MyEvent;

它编译得很好,但是我不能在我的派生类中引发事件而没有错误:“事件'ControllerBase.MyEvent'只能出现在+ =或 - =的左侧(除了使用时)来自“ControllerBase”类型中的“

所以,a)我如何在派生类中引发事件,b)任何人都可以建议一种机制来强制从派生类(抽象函数或接口方法)中强制指定事件的连接。谢谢你致电:))

3 个答案:

答案 0 :(得分:10)

最简单的方法是在基类中编写一个方法来提高它:

protected void OnMyEvent(EventArgs e)
{
    // Note the copy to a local variable, so that we don't risk a
    // NullReferenceException if another thread unsubscribes between the test and
    // the invocation.
    EventHandler handler = MyEvent;
    if (handler != null)
    {
        handler(this, e);
    }
}

可能想要使它成为一个虚方法,这样你就可以在派生类中覆盖它......这取决于你的用例。

请注意,此不是强制在派生类中执行任何操作 - 但我认为这是您真正想要的。

答案 1 :(得分:3)

标准模式是添加On<EventName>虚拟保护方法来引发事件

protected virtual OnMyEvent(EventArgs e) {
    var h = MyEvent;
    if (h != null)
        h(this, e);
}

还要记住,事件可以是抽象的或虚拟的:

public abstract event MyEventHandler MyEvent;

虽然这通常仅用于界面,但根据您的具体要求,ControllerBase可能会更好:

public interface IController {
    event MyEventHandler MyEvent;
    bool EnableDTMFDetection(string CallID, Party Party);
    bool DisableDTMFDetection(string CallID, Party Party);
}

public PlatformOne : IControllerBase

    // yadda yadda...

    public event MyEventHandler MyEvent;

    // members of PlatformOne can invoke MyEvent as a normal delegate
}

答案 2 :(得分:1)

在抽象类中创建受保护的事件调用器。

protected void InvokeMyEvent(EventArgs args)
{
    var handler = MyEvent;
    if (hander != null)
        handler(this, args);
}