Di seguito è riportato il programma che ho utilizzato per il test. Esso stampa (come previsto):Come funzionano gli eventi virtuali in C#?
Raise A
Event from A
Raise B
Event from B
Ora, se cambiamo prime due righe del principale di essere:
A a = new B();
B b = new B();
il programma stamperà:
Raise A
Raise B
Event from B
quali è inoltre, poiché l'evento di sovrascrittura nasconde il campo di backing privato nella classe base e quindi gli eventi attivati dalla classe base non sono visibili ai client della classe derivata.
Ora sto cambiando le stesse linee di:
B b = new B();
A a = b;
e il programma si avvia la stampa:
Raise A
Raise B
Event from A
Event from B
Cosa sta succedendo?
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();
}
}
Articolo "Eventi virtuali in C#: qualcosa è andato storto" - http://www.viva64.com/en/b/0453/ –