委託和事件的學習

2021-07-27 05:23:19 字數 1769 閱讀 3901

參考:寫的內容

1、委託--它是乙個類,它定義了方法的型別,實現將方法作為引數傳遞給另乙個方法來呼叫,這種將方法動態的賦給引數的方式,可以避免了程式中過多的使用switch或if-else

//定義委託,它定義了可以代表方法的型別

public

delegate

void

greetingdelegate(

string

name); //

greetingdelegate類似於string等型別一樣。

public

greetingdelegate

delegate1;//定義乙個委託型別的變數---在客戶端可以對它進行隨意的賦值等操作,嚴重破壞物件的封裝性。

delegate1 = englishgreeting; 

// 先給委託型別的變數賦值,注意第乙個賦值,不能使用 「+=」,否則報錯

delegate1 += chinesegreeting;   

// 給此委託變數再繫結乙個方法

總結:使用委託可以將多個方法繫結到同乙個委託變數,當呼叫此變數時(這裡用「呼叫」這個詞,是因為此變數代表乙個方法),可以依次呼叫所有繫結的方法。

2、事件

event,它封裝了委託型別的變數,使得:

在類的內部,不管你宣告它是public還是protected,它總是private的。在類的外部,註冊「+=」和登出「-=」的訪問限定符與你在宣告事件時使用的訪問符相同。

public event

greetingdelegate

makegreet ;

gm.makegreet = englishgreeting;         

// 編譯錯誤1--只能使用「+=」或者「-=」

gm.makegreet += chinesegreeting;

3、委託、事件和observer模式

設我們有個高檔的熱水器,我們給它通上電,當水溫超過95度的時候:1、揚聲器會開始發出語音,告訴你水的溫度;2、液晶屏也會改變水溫的顯示,來提示水已經快燒開了。

現在我們需要寫個程式來模擬這個燒水的過程,我們將定義乙個類來代表熱水器,我們管它叫:heater,它有代表水溫的字段,叫做temperature;當然,還有必不可少的給水加熱方法boilwater(),乙個發出語音警報的方法makealert(),乙個顯示水溫的方法,showmsg()。

observer設計模式中主要包括如下兩類物件:

subject:監視物件,它往往包含著其他物件所感興趣的內容。在本範例中,熱水器就是乙個監視物件,它包含的其他物件所感興趣的內容,就是temprature欄位,當這個欄位的值快到100時,會不斷把資料發給監視它的物件。

observer:監視者,它監視subject,當subject中的某件事發生的時候,會告知observer,而observer則會採取相應的行動。在本範例中,observer有警報器和顯示器,它們採取的行動分別是發出警報和顯示水溫。

在本例中,事情發生的順序應該是這樣的:

警報器和顯示器告訴熱水器,它對它的溫度比較感興趣(註冊)。

熱水器知道後保留對警報器和顯示器的引用。

熱水器進行燒水這一動作,當水溫超過95度時,通過對警報器和顯示器的引用,自動呼叫警報器的makealert()方法、顯示器的showmsg()方法。

類似這樣的例子是很多的,gof對它進行了抽象,稱為observer設計模式:observer設計模式是為了定義物件間的一種一對多的依賴關係,以便於當乙個物件的狀態改變時,其他依賴於它的物件會被自動告知並更新。observer模式是一種松耦合的設計模式。

學習總結 委託和事件

委託其實是一種型別,是一種定義方法簽名的型別,它支援以new的方式來例項化。委託是使用關鍵字delegate進行定義的,它其實是對方法的包裝和聚集。1.任何與委託簽名匹配的方法都可以分配給委託,實際上是讓這個委託型別繼承了system.multicastdelegate類,system.mutica...

委託和事件學習筆記

委託本身可以使用賦值 name 委託 englishgreeting chinesegreeting 觀察者模式 public class greetingmanager 在客戶端,呼叫看上去更簡潔一些 static void main string args 輸出為 morning,jimmy z...

委託和事件學習筆記

class program class director 處理玩遊戲者 public void playgamehandler object sender,system.eventargs e class employee set 初始化員工類 public employee 開始玩遊戲了 publ...