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.其他
正如你們所見的,上面的兩個類中的方法,一個是靜態,一個不是靜態的。托管函數所指的函數可以是靜態的也可以不是靜態的。