和之前的对比主要就是改了一个格式Object XXX(发布者类的对象)和可能存在的需要传递的数据YYYEventArgs。
标准格式的委托声明包含一个发布者类的对象,参数类型为Object(对象的父类);一个可能需要传递的数据,属于YYYEventArgs类型。
委托在声明的时候名称后面加上EventHandler后缀,定义需要传递的数据类时,名称加上EventArgs后缀。
namespace Delegate
{
// 热水器
public class Heater
{
private int temperature;
public string type = "RealFire 001"; // 添加型号作为演示
public string area = "China Xian"; // 添加产地作为演示
//声明委托,对于委托的命名通常以EventHandler结尾。两个参数一个Object 类型,一个 EventArgs类型(或继承自EventArgs,命名为YYYEventArgs),
//形式上写作(Object XXX,YYYEventArgs Z)。XXX为事件发布者类型的对象,YYYEventArgs类为订阅者类需要用的数据所在类,有时不需要就为null
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
public event BoiledEventHandler Boiled; //声明事件
// 定义BoiledEventArgs类,此类中只包含了一个成员temperature,是订阅者类需要用到的数据。这是Heater类内部的一个类
public class BoiledEventArgs : EventArgs
{
//包含一个属性
public readonly int Temperature;
//定义构造函数功能为读取输入的温度
public BoiledEventArgs(int temperature)
{
this.Temperature = temperature;
}
//也可以不用构造函数,写一个这样的函数方法
/*public readonly int get_temperature(int tem)
{
return tem;
}*/
}
// 加热
public void BoilWater()
{
for (int i = 0; i <= 100; i++)
{
temperature = i;
if (temperature > 95)
{
//建立BoiledEventArgs 对象。
BoiledEventArgs e = new BoiledEventArgs(temperature);
if (Boiled != null)
{
Boiled(this, e);//this就是当前类Heater类的对象,委托结构的第一个参数,相当于Heater heater = new Heater();Boiled(heater,e);
break;
}
}
}
}
}
// 警报器
public class Alarm
{
public void MakeAlert(Object sender, Heater.BoiledEventArgs e)//签名与委托的一致
{
Heater heater = new Heater();
sender = heater; //sender是Heater类型的对象
//访问 sender 中的公共字段
Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.Temperature);
Console.WriteLine();
}
}
// 显示器
public class Display
{//注意这里设置的是静态方法,静态方法是属于类的不属于对象,对象无法调用静态方法
public static void ShowMsg(Object sender, Heater.BoiledEventArgs e)
{
Heater heater = new Heater ();
sender = heater;
Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.Temperature);
Console.WriteLine();
}
}
class Program
{
static void Main()
{
Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.Boiled += alarm.MakeAlert; //注册方法
heater.Boiled += Display.ShowMsg; //注册静态方法似乎不可以实例化引用
heater.BoilWater(); //烧水,会自动调用注册过对象的方法
Console.ReadKey();
}
}
}