Ниже приведена программа, которую я использовал для теста.
Он печатает (как и ожидалось):
Raise A
Event from A
Raise B
Event from B
Теперь, если мы изменим первые две строки Main на:
A a = new B();
B b = new B();
Программа напечатает:
Raise A
Raise B
Event from B
, что также ожидается, поскольку переопределяющее событие скрывает частное вспомогательное поле в базовом классе, и поэтому события, инициируемые базовым классом, не видны клиентам производного класса.
Теперь я изменяю те же строки на:
B b = new B();
A a = b;
и программа начинает печатать:
Raise A
Raise B
Event from A
Event from B
Что происходит?
class A
{
public virtual event EventHandler VirtualEvent;
public void RaiseA()
{
Console.WriteLine("Raise A");
if (VirtualEvent != null)
{
VirtualEvent(this, EventArgs.Empty);
}
}
}
class B : A
{
public override event EventHandler VirtualEvent;
public void RaiseB()
{
Console.WriteLine("Raise B");
if (VirtualEvent != null)
{
VirtualEvent(this, EventArgs.Empty);
}
}
}
class Program
{
static void Main(string[] args)
{
A a = new A();
B b = new B();
a.VirtualEvent += (s, e) => Console.WriteLine("Event from A");
b.VirtualEvent += (s, e) => Console.WriteLine("Event from B");
a.RaiseA();
b.RaiseB();
}
}