热门关键字:  PHP  Cisco  seo  网络广告 虚拟主机 中文域名
当前位置 :| 主页>编程开发>ASP.NET>C#语言>

C#中的委托和事件

来源:blog.csdn.net 作者: 时间:2008-06-25 点击:

 现在我们改写之前的范例,让它符合 .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中委托、事件的实现方式。

 


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
赞助商连接