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

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

它会例如是一个可以替代受保护的OnEvent方法吗? 所以继承类可以直接覆盖事件并直接引发它? 或者那会是错的或者只是不工作?

MSDN对此说明了这一点:

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

但是这并没有让我变得更聪明。 密封的东西是显而易见的。

注:我已经看过虚拟事件如何在C#中工作? 问题,但它并不是真的关于虚拟事件如何工作。 而是这个人如何得到他使用它们的结果。 试图找出他的例子和答案中的虚拟事件是什么,但无法真正理解它。


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

你对虚拟财产的概念感到满意吗?可以重写的是一个吸气和吸气器? 如果是这样,你可以用完全相同的方式来想象一个虚拟事件:而不是一个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#中,派生类无法触发纯粹在基类中定义的事件(无论它具有哪种修饰符)。 因此,我们需要为派生类创建一个新的或重写的事件,并且在大多数情况下,如果想要触发相同的事件,则首选事件是首选事件。

链接地址: http://www.djcxy.com/p/54047.html

上一篇: C#: What are virtual events and how can they be used?

下一篇: How to iterate over Unicode characters in Python 3?