委派演義(1) -- 從倚天屠龍記看委派

對於初學者來講,委派 (Delegate) 是一個聽起來非常令人迷惑的名詞,不過當我們在撰寫 .Net 程式的時候其實都不知不覺地在使用委派。

       對於初學者來講,委派 (Delegate) 是一個聽起來非常令人迷惑的名詞,不過當我們在撰寫 .Net 程式的時候其實都不知不覺地在使用委派。一個最常見的例子就是事件,例如以下的程式碼:


	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
		
	End Sub

 


		private void button1_Click(object sender, EventArgs e)
		{
			
		}

       以上的程式碼就是當你在設計畫面上放了一個 Button 控制項,然後再對著該 Button 雙擊 (Double Click) 後出現的程式碼;事實上這個 Button1_Click (或 button1_Click) 方法就是『委派』給 Button1的Click事件,關於委派和事件的關係容後文再敘,這邊只是簡單的說明『其實你常常在用委派,所以它真的沒有這麼可怕』。

 

       言歸正傳,那委派究竟是什麼?這兩個字實在很難讓人望文生義,還真瞧不出什麼端倪。委派有個近親在 C++ 中稱之為『函式指標』,聽起來有比較容易懂一點,但對初學者來說,『指標』這詞恐怕又是另外一個障礙。所以我決定用一個類比的方法來說明一下委派的概念,所以我們來聊聊倚天屠龍記的主角張無忌,如果我們把單一委派比喻為人的名號,於是:

 

       (1) 在趙敏的心中:無忌哥哥 = 張無忌

       (2) 在金毛獅王的心中: 無忌孩兒 = 張無忌

       (3) 在蛛兒的心中:狠心短命的小鬼  = 張無忌

       (4) 在滅絕師太心中:小淫賊 = 張無忌

 

       我們把張無忌想像成一個Method ,所以呢,在在趙敏的心中就是把『無忌哥哥』這名號委派給張無忌;在在滅絕師太心中則是把『小淫賊』這名號委派給張無忌,以此類推。所以當滅絕師太講到小淫賊三個字就是指向張無忌 ,你可以翻翻倚天屠龍記就可以知道我講的沒錯。這概念很簡單,也應該很容易明瞭吧?那我們怎麼用程式碼表示這樣的委派?

 


Public Class Form1
	Public Delegate Sub 人()
	Public 小淫賊 As 人
	Private Sub 張無忌()
		''聽到有人叫他就答右
		MessageBox.Show("右")
	End Sub

	Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
		小淫賊 = AddressOf 張無忌
	End Sub
	Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
		''假設Button1.Click 事件是滅絕師太叫張無忌
		小淫賊()
	End Sub
End Class

 


	public partial class Form1 : Form
	{
		public Form1()
		{
			InitializeComponent();
		}
		public delegate void 人();
		人 小淫賊;
		private void 張無忌()
		{
			//聽到有人叫他就答右
			MessageBox.Show("右");
		}

		private void Form1_Load(object sender, EventArgs e)
		{
			小淫賊 = 張無忌;
		}


		private void button1_Click(object sender, EventArgs e)
		{
			//假設Button1.Click 事件是滅絕師太叫張無忌
			小淫賊();
		}
	}

 

       程式的一開始我們宣告一個稱為『人』的委派型別,因為假設名號都是要委派給人,然後我們有一個以人為型別的委派變數叫『小淫賊』;接著我們建立一個名為『張無忌』的方法,這方法就是當有人叫他時就答右。Form_Load 就是滅絕師太心中把『小淫賊』委派給『張無忌』,於是當滅絕師在在喊小淫賊的時候,張無忌就會自動答右。

 

       雖然我這例子有點給它亂七八糟,但應該不難懂,如果你是不懂啥叫委派的人,從今天你只要記得『小淫賊就是張無忌,委派可以想像成方法(函式)的外號』,然後再慢慢地去練習去體會它真正的原理。

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