Виртуальное событие - это просто событие, которое может быть переопределено в производном классе.
Довольны ли вы концепцией виртуального свойства с геттером и сеттером, который можно переопределить? Если это так, вы можете думать о виртуальном событии точно так же: вместо метода получения и установки есть операция «добавить» и операция «удалить». Они могут быть виртуальными, поэтому обрабатываются полиморфно. Вы реализуете их так же, как и любой другой виртуальный / переопределенный член.
Пример:
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 есть понятие повышения, но мы пока проигнорируем это.)
Возможно, вы также захотите прочитать мою статью о событиях , если вы немного не уверены в разнице между событием и делегатом.
Лично я нахожу очень редким, что я хочу виртуальное событие.