虚拟事件是如何工作的?您将如何覆盖它?这是如何工作的呢?在什么情况下你会这么做?
例如,它可以替代受保护的OnEvent方法吗?所以继承类可以直接重写事件并直接引发它吗?或者这是错误的,或者只是不起作用?
MSDN是这样说的:
通过使用
关键字,可以将事件标记为虚拟事件。这使派生类能够使用override关键字重写事件行为。重写虚拟事件的事件也可以是密封的,这指定对于派生类,它不再是虚拟的。
但这并没有让我变得更聪明。封存的东西是显而易见的。
注意:我看过的问题,但它实际上并不是关于虚拟事件是如何工作的。更确切地说,这是那个人如何从使用它们中获得结果。我试图从他的例子和答案中找出什么是虚拟事件,但无法真正理解。
发布于 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。
就我个人而言,我发现我很少想要一个虚拟的活动。
发布于 2012-10-08 18:50:05
还要注意,在C#中,派生类不能触发纯粹在基类中定义的事件(无论它有什么修饰符)。因此,我们需要为派生类创建一个新事件或重写事件,并且在大多数情况下,如果要触发相同的事件,则首选重写事件。
发布于 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);
}
}
https://stackoverflow.com/questions/1127851
复制相似问题