关于 C#中委托与事件代码求解 5

网上有一段代码但是有个地方不是很明白先把代码贴上http://blog.csdn.net/hnjhjzyyxgs/article/details/5030348(声明这不... 网上有一段代码但是有个地方不是很明白
先把代码贴上
http://blog.csdn.net/hnjhjzyyxgs/article/details/5030348(声明这不是本人博客,绝不侵犯知识产权)

对于其中一段代码:
// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBoiled(BoiledEventArgs e)
{
if (Boiled != null)
{ // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}

不是很理解,这段代码的作用是什么,他怎么就能拒绝其它对象的监视。
还有那个this又是用来干什么的呢?
求各位大神帮帮忙啊
展开
 我来答
fujie724
2013-09-18 · TA获得超过1187个赞
知道小有建树答主
回答量:154
采纳率:100%
帮助的人:277万
展开全部

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里保存的是当前的温度。


谢谢采纳。

447605958
2013-09-18
知道答主
回答量:14
采纳率:0%
帮助的人:8.5万
展开全部
你看下这个就懂了:
//// 定义委托处理程序
//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;
}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友eadaa35
2013-09-18 · 超过53用户采纳过TA的回答
知道小有建树答主
回答量:141
采纳率:0%
帮助的人:118万
展开全部
1.Boiled是个委托对象,就像ButtonClicked事件(按钮单机这件事)一样(事件也是委托),从代码的语义上理解,水开了这件事,这个委托会对应到一个出来方法,这个处理方法是这个类调用的人编写的(heater.Boiled += FunctionToDealWithBoiled()),用来处理水开这件事,此时Boiled !=null,当然,调用这个类的程序员可能认为水开了不需要管,他就没有把水开这个委托事件关联到某个处理方法,此时Boiled == null。
2.为什么就能时继承类拒绝其它对象的监视,因为使用了 Virtual关键字,继承Heater的子类,例如为某个种类的热水器,全自动的,水开了无需使用者知道(监视),他就会重写这个方法OnBoiled(BoiledEventArgs e),内部的处理逻辑可能是:水开了,关闭电源。所以可以达到【继承类】拒绝其他对象对它的监视的功能。
3.this是指类对于的某个对象,即某一台烧煤气类型的热水器,如果这台热水器没有特殊功能,会继承热水器类本身具有的特性,水开了会通知。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式