C#中事件的继承
C#中的子类无法调用父类的事件,可以通过在父类中创建一个方法来调用父类的事件,而子类通过调用父类的方法来触发事件。
class parent { protected string name; public event Handle OnEvent; protected SendEvent(HandleArgs args) { if (OnEvent != null) { OnEvent(this, args); } } } class clild : parent { public clild() { name = "server1"; } public void Start() { SendEvent(new HandleArgs(State.Start, name)); } }
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
有下面一段代码,目的是实现事件的继承:
基类:
public class BaseBusiness { //声明事件委托 public delegate void ProgressEventHandler(int progress, string msg); //声明事件 public event ProgressEventHandler ProgressEvent; }
派生类:
public class MyBusiness : BaseBusiness { public MyBusiness() { this.ProgressEvent(30,"Testing..."); } }
编译时提示如下错误:
事件“BaseBusiness.ProgressEvent”只能出现在 += 或 -= 的左边(从类型“BaseBusiness”中使用时除外)
出现编译错误的原因是:
事件只能从声明它们的类中调用,派生类不能直接调用在基类声明的事件。
要处理基类的事件,通常通过在基类中为事件创建受保护虚方法(OnEventName)来实现。派生类可以重写基类的OnEventName方法,也可以直接调用基类的OnEventName方法,从而实现调用基类的事件。重写基类的OnEventName方法,派生类可以截获基类正在调用的事件,对这些事件执行它自己的处理。
修改后的代码如下:
基类:
public class BaseBusiness { //声明事件委托 public delegate void ProgressEventHandler(int progress, string msg); //声明事件 public event ProgressEventHandler ProgressEvent; protected virtual void OnProgress(int progress, string msg) { if (this.ProgressEvent != null) this.ProgressEvent(progress, msg); } }
派生类:
public class MyBusiness : BaseBusiness { public MyBusiness() { // 可以直接调用基类的方法 this.OnProgress(this.OnProgressValue, "Testing..."); } // 可以重写基类的方法 protected override void OnProgress(int progress, string msg) { // 在这里添加其他处理代码 base.OnProgress(progress, msg); } }
引文链接: