我正在尝试创建我正在考虑的翻译类,以便我的程序可以与各种目标平台对话。每个平台都将由抽象类的单独实现处理。为了简单起见,我已经减少了一些事情。
我有一个抽象类,有几个抽象方法:
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)任何人都可以建议一种机制来强制从派生类(抽象函数或接口方法)中强制指定事件的连接。谢谢你致电:))
答案 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);
}