2013-03-13 51 views
0

考慮以下情況,可能是這樣的情況是非常假想爲什麼虛擬事件不會不調用重寫處理

public delegate void MyDel(); 

public class T1 
{ 
    public T1() 
    { 

    } 
    public virtual event MyDel MyEvent; 

    public virtual void RaiseEvent() 
    { 
     MyEvent(); 
    } 

    protected virtual void HandleEvent() 
    { 
     MessageBox.Show("base event"); 

    } 
} 

public class T2:T1 
{ 
    public override event MyDel MyEvent; 

    public T2() 
    { 
     MyEvent += new MyDel(HandleEvent); 

    } 

    protected override void HandleEvent() 
    { 
     MessageBox.Show("overridden event"); 
    } 
} 

和主要的客戶端代碼

 baseT = new T2(); 
     baseT.MyEvent += new MyDel(() => MessageBox.Show("From client")); 
     baseT.RaiseEvent(); 

爲什麼它拋出一個異常,爲什麼虛擬事件的行爲不像虛擬/重寫的方法?

+1

您是否讀過異常信息?它說什麼? – Botz3000 2013-03-13 07:20:58

+0

@ Botz3000::),我知道你指向'對象引用',但是如果你無法獲得虛擬覆蓋行爲,爲什麼虛擬覆蓋可能在事件的第一位 – TalentTuner 2013-03-13 07:23:51

回答

1

事件的接口實際上只是一對方法,添加和刪除。爲自動實現的事件生成一個私人後臺代理,只能通過事件名稱在聲明類中訪問。

事件的虛擬關鍵字僅適用於添加/刪除方法對。對於自動實現的事件,訪問和調用後臺代理不是虛擬的。當訂閱發生在派生類(T2)的一個實例上時,它將使用使用自己的後臺代理的重寫添加/刪除方法。基類的後臺代理仍然爲空,並且仍在RaiseEvent中調用。當RaiseEvent被調用時,這會導致NullReferenceException

虛擬事件很少見。我可能會讓事件本身是非虛擬的,並使用受保護的虛擬方法來允許派生類修改事件的行爲。

相關問題