事件发生等于调用这个事件,事件当做函数来调用,为什么能当做函数来调用呢,因为事件
它是委托的实例,委托是一种数据类型,是给方法定义类型的,它定义了函数的签名,
更深层次的说,事件它是委托链,那么就需要调用委托链中的所有方法.
事件用的时候相当于一个函数,你传参数,背后是你调用注册到这个上的所有方法。
热水器发出水开的事件
警报器接受这个事件,做出相应的动作
显示器接受这个事件,做出相应的动作
如果想让警报器和显示器能接受这个事件,那么方法需要注册这个事件。
下面直接上代码:
namespace ShiJian
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Heart hearter = new Heart();
Alarm alarm = new Alarm();
Disply display = new Disply();
hearter.BoilEvent += alarm.MakeAlert; //注册方法
hearter.BoilEvent += alarm.MakeAlert; //注册方法
hearter.BoilEvent += display.ShowMsg; //注册方法
hearter.BoilWater(); //烧水,温度达到99时触发事件
}
}
}
namespace Delegate
{
//热水器类
public class Heart
{
private int temperature = 0; //声明成员变量
public delegate void BoilHander(int param); //声明委托
public event BoilHander BoilEvent; //声明事件
//烧水方法
public void BoilWater()
{
for (int i = 1; i <= 100; i++)
{
temperature++;
if (temperature >= 99 && BoilEvent != null)
{
BoilEvent(temperature); //调用所有注册的方法
}
}
}
}
//警报器类
public class Alarm
{
public void MakeAlert(int param)
{
MessageBox.Show("响铃:滴滴滴,水快开了,度数为:"+param.ToString());
}
}
//显示器类
public class Disply
{
public void ShowMsg(int param)
{
MessageBox.Show("显示当前温度为:" + param.ToString());
}
}
}
结果为:
响铃:滴滴滴,水快开了,度数为:99
响铃:滴滴滴,水快开了,度数为:99
显示当前温度为:99
响铃:滴滴滴,水快开了,度数为:100
响铃:滴滴滴,水快开了,度数为:100
显示当前温度为:100