这2句怎么理解
Boiled(this, e); public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender;
这2句不懂,没有理解。
------------------------------------------------------------------------------
【问题】
问题1. Boiled(this, e); 这个事件中的 this代表什么??问题2. public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender;这句中的
Heater heater = (Heater)sender;这个怎么理解
---------------------------------------------------------------------------------
原代码如下
标准的C#事件入门代码using System;
using System.Collections.Generic;
using System.Text;namespace Delegate {
// 热水器
public class Heater {
private int temperature;
public string type = "RealFire 001"; // 添加型号作为演示
public string area = "China Xian"; // 添加产地作为演示
//声明委托
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
public event BoiledEventHandler Boiled; //声明事件 // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
public class BoiledEventArgs : EventArgs {
public readonly int temperature;
public BoiledEventArgs(int temperature) {
this.temperature = temperature;
}
} // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e) {
if (Boiled != null) { // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}
// 烧水。
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
if (temperature > 95) {
//建立BoiledEventArgs 对象。
BoiledEventArgs e = new BoiledEventArgs(temperature);
OnBoiled(e); // 调用 OnBolied方法
}
}
}
} // 警报器
public class Alarm {
public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender; //这里是不是很熟悉呢?
//访问 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 = (Heater)sender;
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 += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册
heater.Boiled += Display.ShowMsg; //注册静态方法 heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}
}输出为:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Display:China Xian - RealFire 001:
Display:水快烧开了,当前温度:96度。
// 省略 ...
Boiled(this, e); public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender;
这2句不懂,没有理解。
------------------------------------------------------------------------------
【问题】
问题1. Boiled(this, e); 这个事件中的 this代表什么??问题2. public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender;这句中的
Heater heater = (Heater)sender;这个怎么理解
---------------------------------------------------------------------------------
原代码如下
标准的C#事件入门代码using System;
using System.Collections.Generic;
using System.Text;namespace Delegate {
// 热水器
public class Heater {
private int temperature;
public string type = "RealFire 001"; // 添加型号作为演示
public string area = "China Xian"; // 添加产地作为演示
//声明委托
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
public event BoiledEventHandler Boiled; //声明事件 // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
public class BoiledEventArgs : EventArgs {
public readonly int temperature;
public BoiledEventArgs(int temperature) {
this.temperature = temperature;
}
} // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e) {
if (Boiled != null) { // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}
// 烧水。
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
if (temperature > 95) {
//建立BoiledEventArgs 对象。
BoiledEventArgs e = new BoiledEventArgs(temperature);
OnBoiled(e); // 调用 OnBolied方法
}
}
}
} // 警报器
public class Alarm {
public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender; //这里是不是很熟悉呢?
//访问 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 = (Heater)sender;
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 += (new Alarm()).MakeAlert; //给匿名对象注册方法
heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert); //也可以这么注册
heater.Boiled += Display.ShowMsg; //注册静态方法 heater.BoilWater(); //烧水,会自动调用注册过对象的方法
}
}
}输出为:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Alarm:China Xian - RealFire 001:
Alarm: 嘀嘀嘀,水已经 96 度了:
Display:China Xian - RealFire 001:
Display:水快烧开了,当前温度:96度。
// 省略 ...
解决方案 »
- c#如何给视频添加水印
- 操作SQL server2008 插入数据时出错,咋回事?
- c#与xml schema
- C#实现金山屏幕截词功能
- C#判断某列全是'是'后,弹出message的问题?
- datagrid排序后如何在dataset数据源中定位
- 我是初学者 关于C#使SQL数据转为Excel
- 多线程下载邮件
- 明天开始打算学C#了,我会点C和ASP,有没有什么建议,请赐教!
- 异步下载zip文件DownloadProgressChanged的TotalBytesToReceive一直是-1,怎么解决?
- 我这个定时发送怎么取不到值呢?
- 请问【vs2008 调试】调试的时候怎样显示datatable,datarow的数据?
限定被相似的名称隐藏的成员
将对象作为参数传递到其他方法
声明索引器
sender 事件源,表示引发此事件的发起者是谁
Boiled应该是Heater中的一个事件触发,this是将当前Heater对象作为参数传入处理程序。问题2. public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender;这句中的
Heater heater = (Heater)sender;这个怎么理解
MakeAlert应该是个事件处理程序。因为Sender是个Object,要转换为Heater类型做处理
2、Heater heater = (Heater)sender;表示将sender参数强制转型成Heater类型,并赋值给heater对象。之所以能这么做,你看这些代码:Heater heater = new Heater();
Alarm alarm = new Alarm();
heater.Boiled += alarm.MakeAlert; //注册方法heater.BoilWater(); //烧水,会自动调用注册过对象的方法
上述代码,定义了一个Alram类型的对象和一个Heater类型的对象,然后让Alarm类型对象的MakeAlert方法,去处理Heater类型对象的Boiled事件,最后调用Heater类型对象的BoilWater方法,这个方法 //建立BoiledEventArgs 对象。
BoiledEventArgs e = new BoiledEventArgs(temperature);
OnBoiled(e); // 调用 OnBolied方法
会去建立一个BoiledEventArgs类型的参数,接着调用OnBoiled(e);
OnBoiled方法再判断是否有一个方法已经绑定为去处理Boiled事件,如果是,则将Heater对象自身,和参数e,去触发事件。 protected virtual void OnBoiled(BoiledEventArgs e) {
if (Boiled != null) { // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}
触发的事件,被alarm.MakeAlert方法监听到,这个时候,传递个alarm.MakeAlert方法的两个参数,一个就是Heater对象自身,一个就是BoiledEventArgs类型的参数e,所以在MakeAlert方法内,可以将this强制转换成Heater。
{Heater heater = (Heater)sender;}
的作用就是首先
Object sender 转换成 Heat 类型 变成 Heat sender
然后
定义一个新的Heat类型对象 把这个经过转换的对象sender 赋值给新对象
这样也行 真是变态 到底怎么实现的列??我们都知道 Object是所有类的父类
父类引用可以指向子类,但是只能调用父类部分的内容
程序中的
Boiled(this, e);
public void MakeAlert(Object sender, Heater.BoiledEventArgs e)
这个部分实参 this 也就是 Heat heat 和形参 Object sender进行了隐式转换
等于这句话
Object sender= Heat heat
也就是 sender=heat
这个我能理解 后面的
Heater heater = (Heater)sender
怎么也理解不了
这个就等于是 定义一个子类的引用 让他指向父类 这个为什么能成功呢???
这里用(Heater)sender 是将sender参数显示转换为Heater类型
我也是看他的Boiled(this, e); //那个对象调用我 就把那个该对象传到this位置
public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
Heater heater = (Heater)sender; //类型转换委托的模型来源于观察者设计模式