實質上鼓勵一下吧

既然會寫到事件,自然就是程式已經到了大量使用物件導向方式設計的情況,但是在.NET的開發環境底下,事件實際上是沒有辦法被繼承,也沒有辦法由被繼承的物件所觸發的,也就是說,新衍生出來的物件,並沒有辦法對基類的事件做動作。

但是在實際設計程式的時候,偶爾就會有這樣的需求。這樣的需求是有一個標準的做法的,這一篇文章用C#來做例子解釋,實際上VB也是差不多的原理。

public event CycleStartHandler CycleStart;

上面這一行指令是標準的事件宣告寫法,這樣是宣告一個事件CycleStart,並且讓前端程式可以用CycleStartHandler來控制它。

robot.CycleStart += new Robot.CycleStartHandler(robot_CycleStart);

robot是前端物件的實做,上面這一行指令是讓前端的事件處理程式和物件的事件實際綁定,也就是說前端會多出一個事件處理程序CycleStart,而這個處理程序由Robot物件的CycleStartHandler所觸發,並且會帶著一個參數傳過來。

void robot_CycleStart(int CycleNo) {
    label1.Text = string.Format("週期:{0}", CycleNo);
    Application.DoEvents();
}

前端的事件處理程序可以像是上面這段程式來處理。但是這樣的寫法是最基本的寫法,沒有辦法解決事件繼承的問題。

public delegate void CycleStartHandler(int CycleNo);
public event CycleStartHandler CycleStart;

protected virtual void OnCycleStart(int CycleNo) {
    if (CycleStart != null) CycleStart(CycleNo);
}

將事件的宣告一律改成上面的寫法,前面兩行不變,增加的是一個內部使用的方法,借由這個方法來觸發事件,裏面的判斷是爲了確保事件已經被前端綁定,若是沒有檢查,可能會在事件觸發的時候產生錯誤。

OnCycleStart(cycleCount);

也就是說,物件在觸發事件的時候改成呼叫這個方法,這樣寫法的好處是,你在新衍生出來的類別也可以呼叫這個方法,而且還可以繼承這個方法,這樣就解決了,事件不能繼承的問題,而前端的程式卻不用改變。

創作者介紹
創作者 漠哥 的頭像
漠哥

人生四十宅開始 二號宅

漠哥 發表在 痞客邦 留言(4) 人氣()


留言列表 (4)

發表留言
  • 小勝
  • 期待你的下次更新喔^____^
  • 娜娜
  • 生活總是起起伏伏,心情要保持快樂才好哦!!
  • jimin
  • 头 你又开始写程序了啊
  • Linda
  • 文章雖然普通,但意義卻很大~~^^~~