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