委派演義(2) -- 多重委派與桃谷六仙

前文拿了張無忌當例子說明了單一委派的狀況,這節就用桃谷六仙來聊聊多重委派。

       前文拿了張無忌當例子說明了單一委派的狀況,這節就用桃谷六仙來聊聊多重委派。

 

       先說點正經的,來看看委派型別的宣告是怎麼一回事。在前一篇的例子中,我宣告了一個名為『人』的委派型別。

 

       (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 類別的繼承階層架構明顯的表明了這一點。

MulticastDelegate

(圖片來源:MSDN 文件庫 [ MulticastDelegate 類別 ])

 

       上圖有一句很重要的話『表示多點傳送的委派 (Delegate);也就是說,委派可以在它的引動過程清單中包含一個以上的項目。』,這表示委派是多重的,也就是說我們可以同時把多的方法委派給一個委派執行個體,就感覺上很像個方法的集合這樣。

 

       我們以笑傲江湖中桃谷六仙為例,當有人呼叫桃谷六仙的時候,他們六個廢話總是特別多,而且每一個都會自我介紹,這就是一種多重委派的類比,只要我喊『桃谷六仙』就會有六個方法被執行,那我們要怎麼用程式來表現這樣的多重委派?來看看以下的 C# 程式碼:

2012-03-13_191248

       首先在畫面上放一個 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

 

       看完了了桃谷六仙的例子,我想各位應該對於『多點傳送的委派』有所瞭解了吧,當你不清楚的時候,請記得心中默念『桃谷六仙』。

【附註】使用中文寫程式純粹是娛樂效果,不鼓勵開發時使用。