C# 委托 應用實例


用一句話解釋委托:委托是一種可以把引用存儲為函數的類型。

有些類似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度。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM