前文拿了張無忌當例子說明了單一委派的狀況,這節就用桃谷六仙來聊聊多重委派。
前文拿了張無忌當例子說明了單一委派的狀況,這節就用桃谷六仙來聊聊多重委派。
先說點正經的,來看看委派型別的宣告是怎麼一回事。在前一篇的例子中,我宣告了一個名為『人』的委派型別。
(1) 在 Visual Basic 中是這樣宣告的
Public Delegate Sub 人()
(2) 在 C# 是這樣宣告的
public delegate void 人();
為什麼我要分開講?因為 C# 是分大小寫的,所以使用 C# 的人比較不會混淆;用 Visual Basic 的人就不一樣了,如果你用 Delegate 當關鍵字去搜尋 MSDN 文件庫的時候可能會找到的結果是 [ Delegate 類別 ],但其實這個 Delegate 在 Visual Basic 指的是陳述式 [ Delegate 陳述式 ] ,在 C# 的文件中雖然它沒有被歸類在陳述式關鍵字的分類中 [ delegate (C# 參考) ]。但總之不論在 Visual Basic 或 C# 中,它是一個宣告,並非一個類別。
這個宣告有什麼作用?當你用此關鍵字宣告一個委派型別的時候,你可能以為這個委派型別直接繼承了前述所講的 [ Delegate 類別 ],但其實不是,你所宣告的委派型別其實是直接繼承 [ MulticastDelegate 類別 ]而來的,而 MulticastDelegate 類別才是直接繼承自 Delegate 類別,從 MSDN 文件庫中關於 MulticastDelegate 類別的繼承階層架構明顯的表明了這一點。
(圖片來源:MSDN 文件庫 [ MulticastDelegate 類別 ])
上圖有一句很重要的話『表示多點傳送的委派 (Delegate);也就是說,委派可以在它的引動過程清單中包含一個以上的項目。』,這表示委派是多重的,也就是說我們可以同時把多的方法委派給一個委派執行個體,就感覺上很像個方法的集合這樣。
我們以笑傲江湖中桃谷六仙為例,當有人呼叫桃谷六仙的時候,他們六個廢話總是特別多,而且每一個都會自我介紹,這就是一種多重委派的類比,只要我喊『桃谷六仙』就會有六個方法被執行,那我們要怎麼用程式來表現這樣的多重委派?來看看以下的 C# 程式碼:
首先在畫面上放一個 MultiLine 的 TextBox 和一個 Button。
public Form1() { InitializeComponent(); } public delegate void 人(); 人 桃谷六仙; private void Form1_Load(object sender, EventArgs e) { textBox1.Clear(); 桃谷六仙 += 桃根仙; 桃谷六仙 += 桃幹仙; 桃谷六仙 += 桃枝仙; 桃谷六仙 += 桃葉仙; 桃谷六仙 += 桃花仙; 桃谷六仙 += 桃實仙; } private void 桃根仙() { textBox1.Text +=String.Format("{0}{1}", "我是大哥,叫做桃根仙", Environment .NewLine ); } private void 桃幹仙() { textBox1.Text +=String.Format("{0}{1}", "我是二哥,叫做桃幹仙",Environment .NewLine ); } private void 桃枝仙() { textBox1.Text += String.Format("{0}{1}", "我不知是三哥還四哥,叫做桃枝仙", Environment.NewLine); } private void 桃葉仙() { textBox1.Text += String.Format("{0}{1}", "我也不知是三哥還四哥,叫做桃葉仙", Environment.NewLine); } private void 桃花仙() { textBox1.Text += String.Format("{0}{1}", "我是五哥,叫做桃花仙,六兄弟中以我的名字最是好聽", Environment.NewLine); } private void 桃實仙() { textBox1.Text += String.Format("{0}{1}", "我是六弟,叫做桃實仙", Environment.NewLine); } private void button1_Click(object sender, EventArgs e) { 桃谷六仙(); } }
為什麼我會先講 C# 程式碼,因為在 C# 中多重委派的加入可以非常的直覺,就是用 委派變數 += 方法名稱 就可以了,在此程式碼 Form Load 部份就是將六兄弟都加入到『桃谷六仙』這個委派變數所指向的執行個體,所以當有人一喊桃谷六仙,他們六兄弟就會開始廢話。
那在 Visual Basic 要怎麼做 ? 你沒法子像 C# 那樣直接用 委派變數 += 方法名稱 這樣的方式,Visual Basic 編譯器並不認識這樣的語法。有一種方式是使用 [ Delegate.Combine 方法 ],以下我們來看看在 Visual Basic 中怎麼做多重委派:
Public Class Form1
Public Delegate Sub 人()
Public 桃谷六仙 As 人
Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
TextBox1.Clear()
Dim 一群人(5) As 人
一群人(0) = AddressOf 桃根仙
一群人(1) = AddressOf 桃幹仙
一群人(2) = AddressOf 桃枝仙
一群人(3) = AddressOf 桃葉仙
一群人(4) = AddressOf 桃花仙
一群人(5) = AddressOf 桃實仙
桃谷六仙 = [Delegate].Combine(一群人)
End Sub
Private Sub 桃根仙()
TextBox1.Text += String.Format("{0}{1}", "我是大哥,叫做桃根仙", Environment.NewLine)
End Sub
Private Sub 桃幹仙()
TextBox1.Text += String.Format("{0}{1}", "我是二哥,叫做桃幹仙", Environment.NewLine)
End Sub
Private Sub 桃枝仙()
TextBox1.Text += String.Format("{0}{1}", "我不知是三哥還四哥,叫做桃枝仙", Environment.NewLine)
End Sub
Private Sub 桃葉仙()
TextBox1.Text += String.Format("{0}{1}", "我也不知是三哥還四哥,叫做桃葉仙", Environment.NewLine)
End Sub
Private Sub 桃花仙()
TextBox1.Text += String.Format("{0}{1}", "我是五哥,叫做桃花仙,六兄弟中以我的名字最是好聽", Environment.NewLine)
End Sub
Private Sub 桃實仙()
TextBox1.Text += String.Format("{0}{1}", "我是六弟,叫做桃實仙", Environment.NewLine)
End Sub
Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
桃谷六仙()
End Sub
End Class
看完了了桃谷六仙的例子,我想各位應該對於『多點傳送的委派』有所瞭解了吧,當你不清楚的時候,請記得心中默念『桃谷六仙』。
【附註】使用中文寫程式純粹是娛樂效果,不鼓勵開發時使用。