A continuación se muestra el programa que utilicé para la prueba. Imprime (como se esperaba):¿Cómo funcionan los eventos virtuales en C#?
Raise A
Event from A
Raise B
Event from B
Ahora, si cambiamos dos primeras líneas del principal a ser:
A a = new B();
B b = new B();
el programa imprimirá:
Raise A
Raise B
Event from B
cual es también esperado, ya que el evento dominante oculta el campo de respaldo privado en la clase base y, por lo tanto, los eventos activados por la clase base no son visibles para los clientes de la clase derivada.
Ahora estoy cambiando las mismas líneas a:
B b = new B();
A a = b;
y el programa comienza la impresión:
Raise A
Raise B
Event from A
Event from B
¿Qué está pasando?
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();
}
}
Artículo "Eventos virtuales en C#: algo salió mal" - http://www.viva64.com/es/b/0453/ –