淺析C#中的Delegate

1.什麼是託管函數

託管函數是一個對類裏面的某個函數的一個引用。它自己並沒有具體的函數定義,只是指向某個函數實現。

2.與C++,Delphi的橫向比較

在C++和Delphi中與託管函數對應的類型是函數指針,形式如下:

C++   

typedef (int GetNum)(real rNum);

Delphi   

function GetNum(rNum:real): integer; external;

這裏定義函數指針,他們所能指向的函數定義的傳入參數必須是實型,傳出爲整型。   

3.託管函數有什麼用

由於託管函數是對類裏面某個函數的一個引用。所以我們不必知道這個函數的具體名字是什麼,而只需要調用託管函數,讓託管函數去調用相應的函數就可以了。一個例子:一個公司,一個領導,一個領導祕書,三個員工分別管理市場,策劃和生產。這裏祕書就相當與一個託管函數,領導要下達什麼命令(獲得市場信息,生產什麼產品),只需要對祕書說給我一份市場報告或者我們不生產原子彈轉向生產氫彈。然後再由祕書根據領導的命令選擇的去找哪個員工,再把員工獲得的信息返回給領導。這裏面三個員工對於領導是透明的,領導並不知道自己下達的命令具體是由誰執行的。 

4.如何定義和使用
  
接着上面的例子,我們聲明一個祕書託管函數原型。

class Secretory   
{   
//定義託管函數原型   
private delegate string Do(string command);   
//創建託管函數實例   
public Do Doit;   
//給祕書下達命令執行   
public void ExecuteCommand(string command)   
{   
switch(祕書根據命令判斷是要給誰執行的)   
{   

case 調研市場的人:  

Doit=new Do(new MarketMan().GetMarketInfo);   
Break;   

 

Case 生長產品的人:

Doit=new Do(new ProductMan().ProduceProduct);   
Break;   
Default:  
Break;   
}   
}   
Doit(command);   
}   
///調研市場的那個人的類   
class MarketMan   
{   
public string GetMarketInfo(string command)   
{ 根據命令調查信息, 返回獲得信息 ;}   
}   
///生產產品的人   
class ProductMan   
{   
public static string ProduceProduct(string command)   
{ 根據命令生產產品,並返回生產工程中的信息;}   
}

ok,那麼如何執行呢?老闆怎麼使用Secretory這個類呢?

go on

老闆只需要把祕書叫(new)過來,直接向他下達命令,然後就可以喝茶去了~ ^_^

class Boss   
{   
public void static main()   
{   
(new Secretory()).Doit(“我們要生產氫彈,把以前的原子彈都扔到日本好了”);   
}  
}  

   
5.其他

正如你們所見的,上面的兩個類中的方法,一個是靜態,一個不是靜態的。託管函數所指的函數可以是靜態的也可以不是靜態的。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章