A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

我以前发表过关于委托的概念的帖子,有人密我有没有好的例子。今天上网看到了一个,比我写的更标准,就分享让大家来看看。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;

  4. namespace Delegate {
  5.     // 热水器
  6.     public class Heater {
  7.        private int temperature;
  8.        public string type = "RealFire 001";       // 添加型号作为演示
  9.        public string area = "China Xian";         // 添加产地作为演示
  10.        //声明委托
  11.        public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);
  12.        public event BoiledEventHandler Boiled; //声明事件

  13.        // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
  14.        public class BoiledEventArgs : EventArgs {
  15.            public readonly int temperature;
  16.            public BoiledEventArgs(int temperature) {
  17.               this.temperature = temperature;
  18.            }
  19.        }

  20.        // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
  21.        protected virtual void OnBoiled(BoiledEventArgs e) {
  22.            if (Boiled != null) { // 如果有对象注册
  23.               Boiled(this, e);  // 调用所有注册对象的方法
  24.            }
  25.        }
  26.       
  27.        // 烧水。
  28.        public void BoilWater() {
  29.            for (int i = 0; i <= 100; i++) {
  30.               temperature = i;
  31.               if (temperature > 95) {
  32.                   //建立BoiledEventArgs 对象。
  33.                   BoiledEventArgs e = new BoiledEventArgs(temperature);
  34.                   OnBoiled(e);  // 调用 OnBolied方法
  35.               }
  36.            }
  37.        }
  38.     }

  39.     // 警报器
  40.     public class Alarm {
  41.        public void MakeAlert(Object sender, Heater.BoiledEventArgs e) {
  42.            Heater heater = (Heater)sender;     //这里是不是很熟悉呢?
  43.            //访问 sender 中的公共字段
  44.            Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);
  45.            Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
  46.            Console.WriteLine();
  47.        }
  48.     }

  49.     // 显示器
  50.     public class Display {
  51.        public static void ShowMsg(Object sender, Heater.BoiledEventArgs e) {   //静态方法
  52.            Heater heater = (Heater)sender;
  53.            Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
  54.            Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
  55.            Console.WriteLine();
  56.        }
  57.     }

  58.     class Program {
  59.        static void Main() {
  60.            Heater heater = new Heater();
  61.            Alarm alarm = new Alarm();

  62.            heater.Boiled += alarm.MakeAlert;   //注册方法
  63.            heater.Boiled += (new Alarm()).MakeAlert;      //给匿名对象注册方法
  64.            heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);    //也可以这么注册
  65.            heater.Boiled += Display.ShowMsg;       //注册静态方法

  66.            heater.BoilWater();   //烧水,会自动调用注册过对象的方法
  67.        }
  68.     }
  69. }

  70. 输出为:
  71. Alarm:China Xian - RealFire 001:
  72. Alarm: 嘀嘀嘀,水已经 96 度了:
  73. Alarm:China Xian - RealFire 001:
  74. Alarm: 嘀嘀嘀,水已经 96 度了:
  75. Alarm:China Xian - RealFire 001:
  76. Alarm: 嘀嘀嘀,水已经 96 度了:
  77. Display:China Xian - RealFire 001:
  78. Display:水快烧开了,当前温度:96度。
  79. // 省略 ...
复制代码

2 个回复

倒序浏览
这个例子在网上看到过  前面好像有一段更浅的代码的,把那一部分发布出来更容易看懂后面的
回复 使用道具 举报
淡.。 发表于 2013-4-22 18:50
这个例子在网上看到过  前面好像有一段更浅的代码的,把那一部分发布出来更容易看懂后面的 ...

我之前发过委托的最基础的例子。这个是综合一下,比较标准,呵呵
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马