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

问题描述 投票:21回答:3

虚拟事件如何运作?您将如何覆盖它?那将如何工作?在什么情况下您会这样做?

例如,是否可以很好地替代受保护的OnEvent方法?这样继承的类可以重写事件并直接引发它?还是那是错误的,或者就是行不通?

MSDN对此说道:

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

但是那并没有使我更加明智。密封的东西是显而易见的。

注:我已经看到了How virtual events work in C# ?问题,但实际上与虚拟事件的工作方式无关。相反,这是该人从使用它们获得结果的方式。试图从他的例子和答案中找出什么是虚拟事件,但实际上并没有任何意义。

c# events inheritance virtual
3个回答
28
投票

虚拟事件只是在派生类中被[[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。>>

我个人发现它[[非常

很少想要虚拟活动。

0
投票

0
投票
© www.soinside.com 2019 - 2024. All rights reserved.