步步为营C#技术漫谈五、事件与委托机制
概述
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();//-------------------------------------
}
}
输出时选控制台应用程序如图:
结果如下图:
补充:软件开发 , C# ,