关于 C#中委托与事件代码求解 5
先把代码贴上
http://blog.csdn.net/hnjhjzyyxgs/article/details/5030348(声明这不是本人博客,绝不侵犯知识产权)
对于其中一段代码:
// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e)
{
if (Boiled != null)
{ // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}
不是很理解,这段代码的作用是什么,他怎么就能拒绝其它对象的监视。
还有那个this又是用来干什么的呢?
求各位大神帮帮忙啊 展开
1、这段代码的作用是什么
答:
这是一段典型的触发事件的代码。我们先来理解一下事件。
事件的意思就是,“当谁做了什么事情的时候”,就是一个事件。
例如最简单的,“Button按钮的Click事件“。编程的时候,只需要把按钮的Click事件注册到一个函数上,则这个按钮被鼠标点击后,就会自动调用这个函数。
那么这个是怎么做到的呢?其实内部的实现就和这里的例子一样的原理。
在这个例子中,有一段代码清晰的写了。当temperature > 95时,也就是温度大于95时。
OnBoiled(e); // 调用 OnBolied方法
调用这个方法。这个方法就是你问的这个问题。
那么这个方法里做了什么?
a、首先是看外面有没有人注册了Bolied这个事件。(Boiled != null)
就比如Button的Click事件一样,如果没有人要用到这个事件,那我就什么都不用做啦。我偷懒。
所以这里要首先判断一下事件是否为空?为空就代表根本没人要用到。
b、如果不为空呢?就触发这个事件给注册的函数。(Boiled(this, e))
这句就是简单的将事件触发给注册的函数。
所以这样一来,就实现了一个简单的事件流
“水温度到95度了-》有人监视这个事件-》告诉监视的人我触发Bolied事件了-》系统调用注册的事件函数做该做的事"
2、他怎么就能拒绝其它对象的监视。
答:
OnBoiled这是一个虚方法,因为定义了virtual。
在这个虚方法中。触发了Boiled这个事件。那么其他对象就可以通过监视Boiled事件,来得知何时水烧到了95度以上。
如果在实际使用这个Heater类的时候,不希望的对象可以监视到这个事件。那么很简单。你只需要先写一个类,继承这个Heater,然后重写掉OnBoiled方法即可。如下:
public class WanjialeHeater : Heater //例如我做个类叫做万家乐热水器
{
//那么所有的属性和方法都可以从Heater继承下来。
//此时我不希望被其他对象监视的话,我就重写OnBoiled这个方法
protected override void OnBoiled(BoiledEventArgs e)
{
//什么代码也不写,留空
//或者写一点其他你需要的功能来替代原来父类的作法
}
}
这样一来。当你使用这个WanjialeHeater类的时候,即使注册了Boiled事件,也永远不会被触发,从而达到了拒绝监视的效果。
其实,当父类的方法使用virtual关键字的时候,其意义是放开了对继承类良好的重写的权限。
如果继承类里使用了override来重写这个虚方法后,则父类里凡是要调用这个方法的地方,全部都会自动转到继承类里改写后的方法里,而不走父类的方法了。(所以上面的代码中,我全部留空的话就可以达到事件永远不会对外触发的效果)
3、那个this又是用来干什么的呢?
答:this指的就是自己,也就是Heater。在这里把this当参数传进去的主要原因是。
在定义委托的时候规定了参数。如原文中:
public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
所以在调用事件委托的时候,也必须传2个相应的参数进去。
在事件里,这两个参数虽然不是一个强制的要求,但是是一个规范的作法,所以一般都这样规定。
他们的意义是:
Object sender:这个事件是由谁引起的?
BoiledEventArgs e:这个事件里包含了哪些细节?
将这两个参数传出去之后,可以方便在外部触发了事件之后,轻松的获得事件的主要信息。
例如。如果这是一个“人吃东西”的事件的话。那么sender代表的就是“那个人是谁?”, e代表的就是“他吃了什么,吃了多少,多快速度吃完等等”。
所以这里把this传进去。就是要告诉外面的类,触发Boiled这个事件的人,是Heater我自己。然后e里保存的是当前的温度。
谢谢采纳。
//// 定义委托处理程序
//public delegate void PlayGameHandler(object sender,System.EventArgs e);
/// <summary>
/// 事件的发布者
/// </summary>
public class EventPublisher
{
// 第一步是申明委托
public delegate int sampleEventDelegate(string messageInfo);
// 第二步是申明与上述委托相关的事件
public event sampleEventDelegate sampleEvent;
public void DoSomthing()
{
// 激发事件
if(this.sampleEvent!=null)
{
this.sampleEvent("委托");
}
}
}
/// <summary>
/// 接受者1
/// </summary>
public class People1
{
public People1(EventPublisher publisher)
{
publisher.sampleEvent += new EventPublisher.sampleEventDelegate(ResponseEvent);
}
private int ResponseEvent(string msg)
{
Console.WriteLine(msg + " --- 接受者1");
return 0;
}
}
/// <summary>
/// 接受者2
/// </summary>
public class People2
{
public People2(EventPublisher publisher)
{
publisher.sampleEvent += new EventPublisher.sampleEventDelegate(ResponseEvent);
}
private int ResponseEvent(string msg)
{
Console.WriteLine(msg + " --- 接受者2");
return 0;
}
}
}
2.为什么就能时继承类拒绝其它对象的监视,因为使用了 Virtual关键字,继承Heater的子类,例如为某个种类的热水器,全自动的,水开了无需使用者知道(监视),他就会重写这个方法OnBoiled(BoiledEventArgs e),内部的处理逻辑可能是:水开了,关闭电源。所以可以达到【继承类】拒绝其他对象对它的监视的功能。
3.this是指类对于的某个对象,即某一台烧煤气类型的热水器,如果这台热水器没有特殊功能,会继承热水器类本身具有的特性,水开了会通知。