代码改变世界

温故委托

2010-08-02 19:49  三皮开发时  阅读(171)  评论(0编辑  收藏  举报

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    
class HandlerEventArgs
    {
    }

    
//定义事件数据类
    public class BoiledEventArgs : EventArgs
    {
        
public readonly int temperature;
        
public BoiledEventArgs(int temperature)
        {
            
this.temperature = temperature;
        }
    }

    
public delegate void BoiledEventHandler(object sender, BoiledEventArgs e);//定义委托

    
public class Heater
    {
        
private int temperature;
        
public string type = "RealFire 001";//添加更多的属性,除了温度,这里的字段描述是:型号

        
public string area = "China Xian";//添加产地作为演示 
        public event BoiledEventHandler Boiled;//声明事件       

        
//可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
        protected virtual void OnBoiled(BoiledEventArgs e)
        {
            
if (Boiled != null)//判断是否有注册对象,如有,则运行注册对象方法
            {
                Boiled(
this, e);
            }
        }

        
public void BoilWater()
        {
            
for (int i = 0; i <= 100; i++)
            {
                temperature 
= i;
                
if (temperature > 95)
                {
                    BoiledEventArgs e 
= new BoiledEventArgs(temperature);
                    OnBoiled(e);
//调用OnBoiled
                }
            }
        }
    }



    
//警报器
    public class Alarm
    {
        
public void MakeAlert(object sender, BoiledEventArgs e)
        {
            Heater heater 
= (Heater)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, BoiledEventArgs e)
        {
            Heater heater 
= (Heater)sender;
            Console.WriteLine(
"Display:{0}-{1}:", heater.area, heater.type);

            Console.WriteLine(
"Display:水快烧开了,当前温度:{0}度。", e.temperature);
            Console.WriteLine();
        }
    }

    
public class Entrance : Heater
    {
        
static void Main(string[] args)
        {
            Heater heater 
= new Heater();
            Alarm alarm 
= new Alarm();

            heater.Boiled 
+= alarm.MakeAlert;//注册方法 
            heater.Boiled += new Alarm().MakeAlert;//给匿名方法注册方法

            heater.Boiled 
+= new BoiledEventHandler(alarm.MakeAlert);//全称注册方式
            heater.Boiled += Display.ShowMsg;//注册静态方法

            
//heater.Boiled -= alarm.MakeAlert;//注销这个方法

            heater.BoilWater();
//调用注册过的方法                       
        }
    }
}