首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C#:什么是虚拟事件,如何使用它们?

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

Stack Overflow用户
提问于 2009-07-14 20:32:29
回答 3查看 11.3K关注 0票数 23

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

例如,它可以替代受保护的OnEvent方法吗?所以继承类可以直接重写事件并直接引发它吗?或者这是错误的,或者只是不起作用?

MSDN是这样说的:

通过使用

关键字,可以将事件标记为虚拟事件。这使派生类能够使用override关键字重写事件行为。重写虚拟事件的事件也可以是密封的,这指定对于派生类,它不再是虚拟的。

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

注意:我看过的问题,但它实际上并不是关于虚拟事件是如何工作的。更确切地说,这是那个人如何从使用它们中获得结果。我试图从他的例子和答案中找出什么是虚拟事件,但无法真正理解。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-14 20:38:01

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

你对虚拟财产的概念满意吗?它有一个可以被覆盖的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本身有提升的概念,但我们暂时忽略这一点。)

如果你对事件和委托之间的区别有点模糊,你可能还想读一读my article on events

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

票数 33
EN

Stack Overflow用户

发布于 2012-10-08 18:50:05

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

票数 0
EN

Stack Overflow用户

发布于 2019-09-29 05:55:07

对于要提出的Foo,我发现在可接受的答案中缺少两个替代方案。

public class Base 
{
    public virtual event EventHandler Foo;

    public void Bar()
    {
        RaiseFoo();
    }

    protected virtual void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}

public class Derived : Base
{
    // In this case we use the base Foo as a backing store.
    public override event EventHandler Foo
    {
        add { base.Foo += value; }
        remove { base.Foo -= value; }
    }
}

public class Derived2 : Base
{
    public override event EventHandler Foo;

    // In this case we raise the overriden Foo.
    protected override void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}

class Test
{
    static void Main()
    {
        Base x = new Derived();
        x.Foo += (sender, e) => { };
        x.Bar();
        Base x2 = new Derived2();
        x2.Foo += (sender, e) => { };
        x2.Bar();
    }
}

请注意,这不起作用:

public class Derived3 : Base
{
    public override event EventHandler Foo
    {
        add { base.Foo += value; }
        remove { base.Foo -= value; }
    }

    protected override void RaiseFoo()
    {
        Foo?.Invoke(this, EventArgs.Empty);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1127851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档