委託與事件(淺度分析) 委託

2021-08-23 14:12:26 字數 2331 閱讀 4487

前言

對於委託和事件,初次接觸是在《大話設計模式》這本書中,但是裡面只是說明了一下委託和事件是如何使用的,並沒有詳細的講解委託和事件是什麼,所以不甚理解。因為不清楚委託和事件,所以每次想到它心裡就很不舒服,總有乙個解不開的結。現在對於它們稍微理解了一點兒,心裡的石頭也可以暫時放一放了。

委託由來

先說一下我自己對於委託的理解:委託的作用就是可以把方法當做引數一樣使用。從而可以避免大量使用判斷語句,也使程式具有更好的擴充套件性。可能看完上面的話,不知道什麼意思,接下來就一步步分析。

1.先來看乙個例子:

//打招呼

public

void

greetpeople(string name)

//中國人打招呼

public

void

chinesegreeting(string name)

上面的語句很容易理解吧,用漢語打招呼可能有的外國人聽不懂,那怎麼辦呢?再增加乙個英國人打招呼的方法唄。

public

void

englishgreeting(string name)

那麼,相應的 greetpeople 方法也要更改,否則怎麼知道應該用哪種方法向別人打招呼呢?當然為了輸入的正確性,可以再用乙個列舉將這兩種語言封裝起來。

public

enum language

public

void

greetpeople(string name, language lang)

}

雖然上面的問題解決了,可是如果需要再增加日本人,南韓人的打招呼的方法呢?還得再修改 greetpeople 的方法,這樣就違背了「開閉原則」,不利於程式的擴充套件。

2.接下來,問題又來了:既然不想違背「開閉原則」,有沒有一種解決辦法呢?可不可以直接把方法當做引數傳進 greetpeople 方法裡,然後直接呼叫傳進去的方法,這樣就避免了選擇,新增其他打招呼的方法時也不需要更改 greetpeople 方法了。用偽**舉乙個示例:

public

greetpeople(一種型別 方法)

答案就是:當然有!接下來就是委託登場了。沒錯,上面的一種型別指的就是委託型別。所以說委託只是一種型別,只不過略微特殊一點,它是把方法當做引數。

委託的作用

大家都知道,方法不可能全寫在乙個類中,一般方法都會分布在不同的類中,那如果想跨類呼叫方法,應該怎麼辦呢?有的人說利用多型就可以啊。很正確,利用多型是可以實現,但是前提是還得繼承父類或實現介面。而委託無需這樣,就可以跨類呼叫。接下來,對比一下:

//利用多型實現

public

inte***ce igreeting

public

class englishgreeting : igreeting

}public

class chiesegreeting : igreeting

}class program

static

void main(string args)

}

//利用委託實現

public delegete void

greetingdelegate(stirng name);

class program

static

void main(string args)

}

通過比較可以發現,利用多型,還需要定義介面或者繼承父類,而且在呼叫的時候還需要例項化。而利用委託,直接將方法名傳遞就可以。

委託的繫結

那麼委託的繫結過程又是怎麼樣呢?先不管它,先來想乙個問題:既然委託是一種型別,可不可以像普通型別那樣進行賦值呢?比如:string name = 「vijay」;

static

void main(string args)

這樣也是可以的,但是注意第一次用到是賦值「=」,第二次用的是「+=」。如果第一次也用「+=」就會出現「使用了未賦值的區域性變數」的編譯錯誤。

其實 delegate1 = englishgreeting;是下面這樣的:

greetingdelegate delegate1 =new greetingdelegate(englishgreeting);
我認為給委託繫結方法其實就是將方法賦給乙個委託型別的變數。只不過不同於其他的普通型別,委託可以有多個賦值,即可以繫結多個方法。 小結

例項分析 事件與委託

事件 public delegate void timeeventhandler string s 委託宣告 class mytime class processtime the time is now s,datetime.now class testtime 委託 delegate void t...

委託與事件

1.建立乙個類,分別建立加 減 乘 除四個方法,通過委託和事件,實現 輸入兩個計算數,完成所有的四個方法的呼叫,計算出結果顯示。建立乙個警察 policeman 類,乙個小偷 thief 類,例項化兩個類的物件,當policeman類中警笛鳴響 alarm 方法執行時,觸發小偷逃跑 runaway ...

委託與事件

委託就是以方法做引數進行傳遞,它定義的是方法的框架,如果用這個委託,所宣告的方法就必須按照給定的引數及返滬型別進行處理。宣告委託的方式 delegate 返回值型別 委託型別名 引數 比如delegate void stringprocess string s 注意這裡的除了前面的delegate,...