用一句話解釋委托:委托是一種可以把引用存儲為函數的類型。
有些類似Spring框架對於接口的用法,向Action中注入Service對象。Action並不知道調用哪個服務層,只有容器通過配置文件
向Action注入Service對象后,Action才能知道調用的是哪個實現的服務層對象。
你傳入的是那個實現類,我就執行哪個實現類的方法。
從網上搜得一段說明,幫助理解:
委托和接口都允許類設計器分離類型聲明和實現。給定的接口可由任何類或結構繼承和實現;
可以為任何類中的方法創建委托,前提是該方法符合委托的方法簽名。接口引用或委托可由不了解實現該接口或委托方法的類的對象使用。
分析下面例子:首先對於一個熱水器對象來說,他滿足一定條件的時候需要觸發一個事件(委托),但這個事件不那么確定或者不只調用一個方法。
那么我們就在這個對象中聲明一個委托方法:
1 using System; 2 using System.Collections.Generic; 3 using System.Text; 4 namespace Delegate 5 { 6 // 熱水器 7 public class Heater 8 { 9 private int temperature; 10 public delegate void BoilHandler(int param); //聲明委托 11 public event BoilHandler BoilEvent; //聲明事件 12 // 燒水 13 public void BoilWater() 14 { 15 for (int i = 0; i <= 100; i++) 16 { 17 temperature = i; 18 if (temperature > 95) 19 { 20 if (BoilEvent != null) 21 { //如果有對象注冊 22 BoilEvent(temperature); //調用所有注冊對象的方法 23 } 24 } 25 } 26 } 27 } 28 }
然后,再定義處理這個事件的一些方法:
1 // 警報器 2 public class Alarm 3 { 4 public void MakeAlert(int param) 5 { 6 Console.WriteLine("Alarm:嘀嘀嘀,水已經 {0} 度了:", param); 7 } 8 }
1 // 顯示器 2 public class Display 3 { 4 public static void ShowMsg(int param) 5 { //靜態方法 6 Console.WriteLine("Display:水快燒開了,當前溫度:{0}度。", param); 7 } 8 }
好了,一切准備好,我們利用注冊事件,調用這些委托的方法:
1 class Program 2 { 3 static void Main() 4 { 5 Heater heater = new Heater(); 6 Alarm alarm = new Alarm(); 7 heater.BoilEvent += alarm.MakeAlert; //注冊方法 8 heater.BoilEvent += (new Alarm()).MakeAlert; //給匿名對象注冊方法 9 heater.BoilEvent += Display.ShowMsg; //注冊靜態方法 10 heater.BoilWater(); //燒水,會自動調用注冊過對象的方法 11 } 12 }
輸出為:
Alarm:嘀嘀嘀,水已經 96 度了:
Alarm:嘀嘀嘀,水已經 96 度了:
Display:水快燒開了,當前溫度:96度。