概述
C#中的委托類似於C或C++中的函數指針。使用委托使程序員可以將方法引用封裝在委托對象內。然後可以將該委托對象傳遞給可調用所引用方法的代碼,而不必在編譯時知道將調用哪個方法。與C或C++中的函數指針不同,委托是面向對象,而且是類型安全的。
C#中的“事件”是當對象發生某些事情時,類向該類的客戶提供通知的一種方法。事件最常見的用途是用於圖形用戶界面;通常,表示界面中的控件的類具有一些事件,當用戶對控件進行某些操作(如單擊某個按鈕)時,將通知這些事件。
使用委托來聲明事件。委托對象封裝一個方法,以便可以匿名調用該方法。事件是類允許客戶為其提供方法(事件發生時應調用這些方法)的委托的一種方法。事件發生時,將調用其客戶提供給它的委托。
注明:委托是對方法的包裝 在不確定要調用什麼方法時候而又不能用抽象或者多態實現的時候用委托。
委托在Observer模式示例:
先創建PilotLamp.cs:
public interface PilotLamp
{
/// <summary>
/// green light
/// </summary>
void TurnOn();
/// <summary>
/// notice
/// </summary>
string Notice
{
get;
set;
}
}
再創建DelegateEvent.cs:
public delegate void EventHandler();再創建TrafficLight.cs:
public class TrafficLight : PilotLamp
{
public event EventHandler Notices;
private string notice;
#region GreenLight 成員
public void TurnOn()
{
if (Notices != null)
Notices();
}
public string Notice
{
get
{
return notice;
}
set
{
notice = value;
}
}
#endregion
}
再創建Driver.cs:
public class Driver
{
private string Name;
private PilotLamp greenLight;
public Driver(string name, PilotLamp greenLight)
{
this.Name = name;
this.greenLight = greenLight;
}
public void GoLeft()
{
Console.WriteLine(string.Format("{1}司機,{0},請向左開車.", greenLight.Notice, Name));
}
}
再創建Pedestrian.cs:
public class Pedestrian
{
private string Name;
private PilotLamp greenLight;
public Pedestrian(string name, PilotLamp greenLight)
{
this.Name = name;
this.greenLight = greenLight;
}
public void GoThrough()
{
Console.WriteLine( string.Format("{0}同志,{1},請向前走.", Name, greenLight.Notice));
}
}
最後再調用:
public partial class Run : Form
{
public Run()
{
InitializeComponent();
}
private void btnRun_Click(object sender, EventArgs e)
{
//-------------------------------------
TrafficLight trafficLight = new TrafficLight();
Driver driverOne = new Driver("張三", trafficLight);
Driver driverTwo = new Driver("李四", trafficLight);
Pedestrian pedestrianOne = new Pedestrian("王五", trafficLight);
Pedestrian pedestrianTwo = new Pedestrian("麻六", trafficLight);
trafficLight.Notices += new Observer.EventHandler(driverOne.GoLeft);
trafficLight.Notices += new Observer.EventHandler(driverTwo.GoLeft);
trafficLight.Notices += new Observer.EventHandler(pedestrianOne.GoThrough);
trafficLight.Notices += new Observer.EventHandler(pedestrianTwo.GoThrough);
trafficLight.Notice = "綠燈亮了.";
trafficLight.TurnOn();
//-------------------------------------
}
}
輸出時選控制台應用程序如圖:
結果如下圖: