Dưới đây là chương trình tôi đã sử dụng để kiểm tra. It in (như dự kiến):Sự kiện ảo hoạt động như thế nào trong C#?
Raise A
Event from A
Raise B
Event from B
Bây giờ, nếu chúng ta thay đổi hai dòng đầu tiên của Main là:
A a = new B();
B b = new B();
Chương trình sẽ in:
Raise A
Raise B
Event from B
đó là cũng được mong đợi, vì sự kiện ghi đè ẩn trường sao lưu riêng tư trong lớp cơ sở và do đó các sự kiện được kích hoạt bởi lớp cơ sở không hiển thị cho các máy khách của lớp dẫn xuất.
Bây giờ tôi thay đổi các dòng cùng:
B b = new B();
A a = b;
và chương trình bắt đầu in:
Raise A
Raise B
Event from A
Event from B
gì đang xảy ra?
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();
}
}
Điều "Sự kiện ảo trong C#: đã xảy ra sự cố" - http://www.viva64.com/en/b/0453/ –