转载(四).Net Framework中的委托与事件
在回答上面的问题之前,我们先搞懂 .Net Framework的编码规范:
l 委托类型的名称都应该以EventHandler结束。
l 委托的原型定义:有一个void返回值,并接受两个输入参数:一个Object 类型,一个 EventArgs类型(或继承自EventArgs)。
l 事件的命名为 委托去掉 EventHandler之后剩余的部分。
l 继承自EventArgs的类型应该以EventArgs结尾。
再做一下说明:
1. 委托声明原型中的Object类型的参数代表了Subject,也就是监视对象,在本例中是 Heater(热水器)。回调函数(比如Alarm的MakeAlert)可以通过它访问触发事件的对象(Heater)。
2. EventArgs 对象包含了Observer所感兴趣的数据,在本例中是temperature。
上面这些其实不仅仅是为了编码规范而已,这样也使得程序有更大的灵活性。比如说,如果我们不光想获得热水器的温度,还想在Observer端(警报器或者显示器)方法中获得它的生产日期、型号、价格,那么委托和方法的声明都会变得很麻烦,而如果我们将热水器的引用传给警报器的方法,就可以在方法中直接访问热水器了。
现在我们改写之前的范例,让它符合 .Net Framework 的规范:
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, BoliedEventArgs e);
public event BoiledEventHandler Boiled;//声明事件
// 定义BoliedEventArgs类,传递给Observer所感兴趣的信息
public class BoliedEventArgs : EventArgs {
public readonly int temperature;
public BoliedEventArgs(int temperature) {
this.temperature = temperature;
}
}
// 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
protected virtual void OnBolied(BoliedEventArgs e) {
if (Boiled != null) { // 如果有对象注册
Boiled(this, e); // 调用所有注册对象的方法
}
}
// 烧水。
public void BoilWater() {
for (int i = 0; i <= 100; i++) {
temperature = i;
if (temperature > 95) {
//建立BoliedEventArgs 对象。
BoliedEventArgs e = new BoliedEventArgs(temperature);
OnBolied(e); // 调用 OnBolied方法
}
}
}
}
// 警报器
public class Alarm {
public void MakeAlert(Object sender, Heater.BoliedEventArgs 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.BoliedEventArgs 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度。
// 省略 ...
总结
在本文中我首先通过一个GreetingPeople的小程序向大家介绍了委托的概念、委托用来做什么,随后又引出了事件,接着对委托与事件所产生的中间代码做了粗略的讲述。
在第二个稍微复杂点的热水器的范例中,我向大家简要介绍了 Observer设计模式,并通过实现这个范例完成了该模式,随后讲述了.Net Framework中委托、事件的实现方式。
转自: http://hi.baidu.com/txh1204
转载于:https://www.cnblogs.com/runy/archive/2009/08/18/1548651.html
转载(四).Net Framework中的委托与事件相关推荐
- .Net Framework中的委托与事件
using System; using System.Collections.Generic; using System.Text;namespace Delegate {// 热水器public c ...
- 观察者模式与.Net Framework中的委托与事件
本文文字内容均选自<大话设计模式>一书. 解释:观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象.这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够 ...
- C# 中的委托和事件(转载)
C# 中的委托和事件 (今天去因为委托和事件这两个东西把我搞得头疼死了,偶然发现这篇文章,觉得非常不错,就copy过来了!) 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而 ...
- [转载] 张子阳 --- C# 中的委托和事件
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- C# 中的委托和事件(1)
C# 中的委托和事件 欢迎浏览本文的后续文章: C#中的委托和事件(续) PDF 浏览:http://www.tracefact.net/Document/Delegates-and-Events-i ...
- 【转】C# 中的委托和事件
阅读目录 C# 中的委托和事件 引言 将方法作为方法的参数 将方法绑定到委托 事件的由来 事件和委托的编译代码 委托.事件与Observer设计模式 .Net Framework中的委托与事件 总结 ...
- C# 中的委托和事件[转]
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易.它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去 ...
- [轉]C# 中的委托和事件
轉自:http://www.cnblogs.com/jimmyzhang/archive/2007/09/23/903360.html pdf:http://www.tracefact.net/Doc ...
最新文章
- Java高并发编程:HandlerThread
- 昂贵的聘礼(poj 1062)
- Kafka消费者详解
- C++构造函数语意学
- 2019-03-15-算法-进化(有效的数独)
- linux 下搭建yolov3错误,Ubuntu20.04+cuda11.1+yolo3 目标检测 深度学习系统 真正从0搭建 包含各类可能遇到的错误...
- POJ 1200 Crazy Search(RK)
- 继续教育自动听课软件_荣耀小口哨app下载-华为荣耀小口哨软件v1.9.9 安卓最新版 - 极光下载站...
- 使用python来操作hive(通过 pyhs2 和 HiveServer2)
- ef core 批量update 非id_Entity Framework (EF) Core
- C语言入门了解篇—C语言编译流程
- web字体设置成平方字体_Web字体正确完成
- PostgreSQL应用(二,客户端工具————CRUD)
- Hibernate逍遥游记-第13章 映射实体关联关系-005双向多对多(使用组件类集合\composite-element\)...
- 防汛抗洪中,北峰应急通信小系统如何筑起通信防线
- AEJoy —— 详解 AE 如何将 png 序列帧导出为 SVGA 动画文件
- 生物在计算机应用,生物技术在计算机领域中的应用有哪些
- mysql ping命令_MySQL常用命令总结
- Android中内存优化
- WPS编辑器实现自定义小功能
热门文章
- LeetCode 241. 为运算表达式设计优先级(动态规划)
- LeetCode 599. 两个列表的最小索引总和(哈希map)
- ubuntu自定义安装里怎么选_中央空调到底应该怎么选?小户型也能安装中央空调?行家说实话了...
- 在c#中用mutex类实现线程的互斥_面试官经常问的synchronized实现原理和锁升级过程,你真的了解吗...
- Python实现给指定的微信朋友发信息
- 刷新页面,无论点击多少次让Element UI的Message消息提示弹出一个
- 谷歌提出 RNN 版 Transformer,或为长文本建模的当前最优解
- 谷歌 | 多任务学习,如何挑选有效的辅助任务?只需一个公式!
- 文末送书 | Facebook:易于解释的神经元可能会阻碍神经网络的学习
- 论文浅尝 | 基于图匹配神经网络的跨语言知识图对齐 (ACL 2019)