虚拟事件如何运作?您将如何覆盖它?那将如何工作?在什么情况下您会这样做?
例如,是否可以很好地替代受保护的OnEvent方法?这样继承的类可以重写事件并直接引发它?还是那是错误的,或者就是行不通?
MSDN对此说道:
可以使用virtual关键字将事件标记为虚拟事件。这使派生类可以通过使用override关键字来覆盖事件行为。覆盖虚拟事件的事件也可以被密封,它指定对于派生类,它不再是虚拟的。
但是那并没有使我更加明智。密封的东西是显而易见的。
注:我已经看到了How virtual events work in C# ?问题,但实际上与虚拟事件的工作方式无关。相反,这是该人从使用它们获得结果的方式。试图从他的例子和答案中找出什么是虚拟事件,但实际上并没有任何意义。
虚拟事件只是在派生类中被[[can覆盖的事件。
您对虚拟属性的概念感到满意吗?它具有可以被覆盖的getter和setter方法?如果是这样,您可以以完全相同的方式来考虑虚拟事件:代替getter和setter的是“添加”操作和“删除”操作。这些可以是虚拟的,因此可以多态处理。您可以采用与实现其他任何虚拟/重写成员相同的方式来实现它们。实施例:
using System;
class Base
{
public virtual event EventHandler Foo
{
add
{
Console.WriteLine("Base Foo.add called");
}
remove
{
Console.WriteLine("Base Foo.remove called");
}
}
}
class Derived : Base
{
public override event EventHandler Foo
{
add
{
Console.WriteLine("Derived Foo.add called");
}
remove
{
Console.WriteLine("Derived Foo.remove called");
}
}
}
class Test
{
static void Main()
{
Base x = new Derived();
x.Foo += (sender, args) => {};
}
}
请注意,事件本身不对引发事件发生的情况负责-只是添加/删除方面。 (无论如何,在C#中; CLR本身具有提高的概念,但我们暂时将其忽略。)如果您对事件和委托之间的区别不太了解,您可能还想读my article on events。>>
我个人发现它[[非常
很少想要虚拟活动。