首先,我們定義委派型別 void MyDelegete();
這裡有必要強調一下委派的宣告規則:委派使用關鍵字 delegate 來宣告,因其本身就是一種型別,故可以在類別內宣告,亦可以獨立於類別而宣告。關鍵字之後是此委派型別的實體部分。不難看出其形式與方法的宣告相近,但不包含函數體。
其實,我們大可理解為委派本身就是定義了一類方法,一類其返回值與參數表和委派實體定義形式完全相同的方法。只有符合委派規則的方法,才可以掛接於此委派的實例物件之上。這也是為什麼,我將整個 void MyDelegete() 稱作委派型別的原因。
接下來我們要在某一個類別內部,運用先前定義的委派型別實例化一個委派物件 MyObjdelegate,並為其掛載一個與之委派型別(無返回值、無參數)相符的自訂方法 MyFun(),這也就是所謂「將方法 MyFun() 的相關細節包裝於委派實例 MyObjdelegate 中」。而後即可在相應的按鈕單擊事件中利用委派物件 MyObjdelegate 呼叫其已經包裝的方法 MyFun() 了。
以上即為由委派定義而得來的委派的簡單用法。不過,以上這個範例顯然沒有什麼實際用途,因為不涉及類別間的相互呼叫,我們大可在事件中直接呼叫本類別的方法 MyFun(),而不必再多繞個彎依靠委派來實現。
不過,如果涉及到跨類別的方法呼叫時,使用委派會怎麼樣呢?
2. 使用本類別的委派物件包裝其他類別的方法
namespace MulClsDelegate
{
delegate void MyDelegete();
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private MyDelegete MyObjdelegate = new MyDelegete(ObjCls.MyFun);
private void button1_Click(object sender, EventArgs e)
{
MyObjdelegate();
}
}
public class ObjCls
{
static public void MyFun()
{
MessageBox.Show("委派掛載的事件呼叫成功!");
}
}
}
這段程式碼和上一段程式碼的意思大同小異,委派型別 void MyDelegete() 的宣告被我移到了類別的外面,當然這不影響大局。主要區別只在於這段程式碼涉及到了使用本類別委派物件跨類別包裝其他類別的方法細節問題——我把原來主類別中的 MyFun() 方法移到了新宣告的一個類別 ObjCls 中,然後再靠主類別中的委派物件去呼叫這個方法。
或許你可能會說,即使我不用委派,也可以透過在主類別中宣告其他的類別物件,然後透過這個類別物件來呼叫其他類別的 public 方法。這樣一來,使用委派依然沒有什麼實實在在的意義。
那麼,呵…… 我們不妨繼續耐心而深入的挖掘委派更深層次的用途