注:本文系學習筆記。
class lesson}}上面的**很清楚,能夠達到我們想要實現的效果。但是這樣寫並不好,假設學校期中考試期間,為了不打擾考試的考試,要求不能響鈴,而考試結束後恢復響鈴,這時候我們處理起來就比較麻煩。又或者我們的lesson這個類表示課前準備工作,是表示上課前30分鐘,我們學生完成的一些事情(假設還有其他事情,比如複習上節課內容,預習新知識等等)。把響鈴和螢幕顯示上課時間放在這個類裡就會有點奇怪。根據物件導向原則,我們應該把響鈴和螢幕顯示單獨放在各自的乙個類裡。**修改如下://響鈴private
void ringbell(int remaintime) 分鐘,請同學們最好上課準備。",remaintime
); }
//螢幕顯示準備上課
private
void displaylesson(int remaintime) 分鐘。
",remaintime);
}}class program
}
public這樣就可以了,但是現在,如何讓在距離上課時間不到5分鐘的時候,響鈴和螢幕顯示準備上課呢。這裡用到observer設計模式。這裡簡單舉個例子說明observer設計模式,中國移動有提供每月話費賬單、流量賬單之類的查詢業務。但是並不是每個人都需要它推送這樣的訊息。有的人可能不需要查詢,有的人可能只關心話費賬單,有的人可能只關心流量問題,有的人可能兩者都需要。那麼移動公司具體是如何為每個人提供他所需要的服務呢?當然是根據使用者訂閱的種類,使用者關心的什麼,就傳送什麼。observer設計模式與此類似,它包含兩類物件。class lesson
}}public
class bell 分鐘,請同學們最好上課準備。",remaintime);
}}public class display 分鐘。",remaintime); } }
subject:監視物件,它包含著其他物件所感興趣的內容。在本範例中,上課就是乙個監視物件,它包含的其他物件所感興趣的內容,就是remaintime欄位,當這個欄位的值小於等於5時,會不斷把資料發給監視它的物件。
observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有鈴鐺和螢幕顯示器,它們採取的行動分別是響鈴和顯示上課準備。
observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。
下面繼續修改**
上例可見,事件實際上就是乙個委託。
public那麼事件跟委託有什麼區別呢,上篇文章介紹了,委託必須初始化之後才能新增繫結的方法,而上面的**我們可以看到直接給事件新增繫結方法。這是因為事件是乙個封裝了的委託,.net框架實際上在編譯的時候已經為時間做了初始化。上面事件的用法與我們見到的.net中的事件形式上不同,實際上.net framework中的事件模型是規範化了的,.net事件的編碼規範如下class lesson}}
}}public
class bell 分鐘,請同學們最好上課準備。
",remaintime);
}}public
class display 分鐘。
",remaintime);
}}class program
}
那麼我們繼續修改我們的**,讓它遵循規範
class lesson最後總結一下:c#中的事件處理實際上是一種具有特殊簽名的delegate,它是將委託進行封裝,不允許直接方位委託本身,只能通過給委託新增和移除繫結的方法。(+=、-=實際上是呼叫了add 和 remove方法)像下面這個樣子:}protected
virtual
void onprepare(prepareeventargs e)
}public
void preparelesson()}}
public
class bell 分鐘,請同學們最好上課準備。",e.remaintime
); }
}public
class display 分鐘。",e.remaintime
); }
}class program
}
public delegate void myeventhandler(object sender, myeventargs e);
其中的兩個引數,sender代表事件傳送者,e是事件引數類。myeventargs類用來包含與事件相關的資料,所有的事件引數類都必須從system.eventargs類派生。當然,如果你的事件不含引數,那麼可以直接用system.eventargs類作為引數。
就是這麼簡單,結合delegate的實現,我們可以將自定義事件的實現歸結為以下幾步:
理解C 中的委託和事件
csdn論壇,由於對方也是 所以源作者不詳 有許多人問的,net中的委託以及事件處理。我拿簡單的例子說明一下,是現實中的例子。比如說 乙個公司 場景 你是老闆,手下有兩個員工,小張和小王。你命令小王,如果小張玩遊戲,則小王扣去小張500元錢。這就是現實中的委託。實際上,在寫程式中,程式設計師就是老闆...
理解C 中的委託和事件
一直不甚至理解c 中委託和事件的概念和用法,在網上參看數篇文字之後略有所得,好記性不如爛鍵盤,故以文字記下。首先,設想乙個簡單場景 或許不太貼切 來說明,夜深人靜,屋裡有老鼠躡手躡腳的行動,且隨時提防著貓,如果聽到貓叫,老鼠聞聲立即逃回洞裡。這個場景可以抽象為委託和事件的幾個要素 貓和老鼠分別是兩個...
C 委託和事件的理解
委託 private delegate string getastring 委託的定義,使用delegate關鍵字 兩種指向方法的寫法 getastring a new getastring x.tostring a指向了x中的tostring方法 getastring a x.tostring 兩...