虚拟活动如何运作?你会怎么覆盖它?那会怎么样?在什么情况下你会这样做?
例如,它是否可以替代受保护的OnEvent方法?那么继承类可以覆盖事件并直接引发它吗?或者那是错的还是不行?
MSDN对此说了这样的话:
可以使用virtual关键字将事件标记为虚拟事件.这使派生类可以使用override关键字覆盖事件行为.还可以密封覆盖虚拟事件的事件,该事件指定对于派生类,它不再是虚拟的.
但这并没有让我更加明智.密封的东西是显而易见的.
注意:我已经看到了C#中的虚拟事件如何工作?问题,但它并不是真正的虚拟事件如何运作.相反,这个人是如何得到他们使用它们得到的结果.试图弄清楚他的例子和答案中的虚拟事件是什么,但实际上并没有真正理解它.
以下是我用于测试的程序.它打印(如预期):
Raise A
Event from A
Raise B
Event from B
Run Code Online (Sandbox Code Playgroud)
现在,如果我们改变Main的前两行是:
A a = new B();
B b = new B();
Run Code Online (Sandbox Code Playgroud)
该计划将打印:
Raise A
Raise B
Event from B
Run Code Online (Sandbox Code Playgroud)
这也是预期的,因为重写事件会隐藏基类中的私有支持字段,因此基类触发的事件对派生类的客户端不可见.
现在我将相同的行改为:
B b = new B();
A a = b;
Run Code Online (Sandbox Code Playgroud)
程序开始打印:
Raise A
Raise B
Event from A
Event from B
Run Code Online (Sandbox Code Playgroud)
这是怎么回事?
class A
{
public virtual event EventHandler VirtualEvent;
public void RaiseA()
{
Console.WriteLine("Raise A");
if (VirtualEvent != null)
{
VirtualEvent(this, EventArgs.Empty);
}
}
}
class B : …Run Code Online (Sandbox Code Playgroud)