5.2.4 正確處理繼承基類中控件的事件
在5.2.3.3節中講的KingTextBox事件中,定義事件的功能語句如下:
/// <summary>
/// 獲得本書更多內容,請看:
/// http://blog.csdn.net/ChengKing/archive/2008/08/18/2792440.aspx
/// </summary>
public virtual void RaisePostDataChangedEvent()
{
OnTextChanged(EventArgs.Empty);
}
protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}
上面代碼中的 RaisePostDataChangedEvent方法首先調用了OnTextChanged,然後OnTextChanged才真正調用 TextChanged(this,e)事件。看上去有些啰唆,如果把OnTextChanged方法去掉,修改後的代碼如下所示:
public virtual void RaisePostDataChangedEvent()
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}
看上去比較簡練,但這種寫法對於繼承此控件的控件,處理基類中事件有些限制。說明原因之前,得先說一下本節的主題,如何處理基類中繼承的事件。
若要處理繼承的事件,需要重寫從基類繼承的受保護的OnEventName方法,而不要附加委托,附加委托不能保證基類中默認的邏輯能夠執行。一般情況下,重寫的方法應該調用基類的OnEventName方法,以確保調用附加到事件的委托(除非不想調用這些委托)。
下面從代碼角度理解上面這段含義,這裡還是以OnTextChanged方法為例說明,在OnTextChanged(即上面提到的OnEventName)方法中會調用默認的事件:
protected virtual void OnTextChanged(EventArgs e)
{
if (TextChanged != null)
{
TextChanged(this, e);
}
}