C#:什么是虚拟事件以及它们如何使用?

虚拟活动如何运作? 你会怎么覆盖它? 那会怎么样? 在什么情况下你会这样做?

例如,它是否可以替代受保护的OnEvent方法? 那么inheritance类可以覆盖事件并直接引发它? 或者那是错的还是不行?

MSDN对此说了这样的话:

可以使用virtual关键字将事件标记为虚拟事件。 这使派生类可以使用override关键字覆盖事件行为。 还可以密封覆盖虚拟事件的事件,该事件指定对于派生类,它不再是虚拟的。

但这并没有让我更加明智。 密封的东西虽然很明显。

注意:我已经看到了C#中的虚拟事件如何工作? 问题,但它并不是真正的虚拟事件如何工作。 相反,这个人是如何得到他们使用它们得到的结果。 试图弄清楚他的例子和答案中的虚拟事件是什么,但实际上并没有真正理解它。

虚拟事件只是可以在派生类中重写的事件。

你对虚拟财产的概念感到满意吗?有一个可以覆盖的getter和setter吗? 如果是这样,你可以用完全相同的方式来思考虚拟事件:而不是getter和setter,有一个“add”操作和一个“remove”操作。 这些可以是虚拟的,因此可以进行多态处理。 您实现它们的方式与实现任何其他虚拟/重写成员的方式相同。

例:

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本身有提升的概念,但我们暂时会忽略它。)

如果您对事件和委托之间的差异略微模糊,您可能还想阅读我关于事件的文章 。

就个人而言,我发现我想要一个虚拟活动。

还要注意,在C#中,派生类无法触发纯粹在基类中定义的事件(无论它具有什么修饰符)。 因此,我们要么需要为派生类创建一个新事件或重写事件,并且在大多数情况下,如果要触发相同的事件,则首选覆盖事件。