DotNet · 2022年2月26日

派生类中无法引发基类中的事件

1:事件是特殊的委托实例包装,限定了只可以在声明它的类中调用,子类要调用,则必须在父类中定义事件触发函数,再由子类调用触发

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));
  }
}
要处理基类的事件,通常通过在基类中为事件创建受保护虚方法(OnEventName)来实现。派生类可以重写基类的OnEventName方法,也可以直接调用基类的OnEventName方法,从而实现调用基类的事件。重写基类的OnEventName方法,派生类可以截获基类正在调用的事件,对这些事件执行它自己的处理。
可能是考虑到事件的封装性,就生成了Private的范围类型,阻止了子类的直接调用。

2:除了在子类不能触发父类事件,别的继承特性等同于方法,字段等




你要想在派生类中触发基类中的事件,很显然是不行的。 

那么现实中我的确需要在派生类中去触发事件那怎么办?? 答案是在基类中提供触发事件的protected
virtual方法,想触发事件时就在派生类中调用这个方法,还有一大用处------就是在派生类在要处理这个事件时,可以不用+=来附加事件处理函数,可以直接重写基类中的这个方法,要注意一点---派生类要用base调用基类中的方法,否则使用+=
附加的事件处理方法不会得到调用。 你好好看一下WinForm中事件的机制,相信你会明白的。  如果你接着问:啊啊啊那

我就非要在派生类中直接去触发那个事件怎么办??? 答案是把event关键字去。对,就这么简单。 但这自然就引出了你的“c#这么设计的意义是什么?” 为什么这么设计? 其实加与不加event关键字,对编译结果完全没有影响。那加这个event有什么用? 答案是加了event关键字,那么在类的外部只允许+=与-=操作,而其它操作是不允许的。这也是你为什么会得到那个编译错误原因。 这是为了防止发生诸如在类的外部执行=操作,从而导致原来附加的方法被覆盖掉


但在派生子类中可以响应事件,如果在父类和子类中都有响应事件,那么,事件的响应顺序是先父类,后子类


最新电影,电视剧,尽在午夜剧场

电影电视剧午夜不寂寞