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本身有提升的概念,但我们暂时会忽略它.)
如果您对事件和委托之间的差异略微模糊,您可能还想阅读我关于事件的文章.
我个人觉得我很想要一个虚拟活动.