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

Svi*_*ish 21 c# events virtual inheritance

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

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

MSDN对此说了这样的话:

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

但这并没有让我更加明智.密封的东西是显而易见的.

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

Jon*_*eet 28

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

你对虚拟财产的概念感到满意吗?有一个可以覆盖的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) => {};
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,事件本身不会对引发它时发生的情况负责 - 只需添加/删除端.(无论如何,在C#中; CLR本身有提升的概念,但我们暂时会忽略它.)

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

我个人觉得我想要一个虚拟活动.