设为首页 加入收藏

TOP

C# 中的委托和事件
2017-10-11 18:27:24 】 浏览:8123
Tags:委托 事件
 1 using System;
 2 using System.Collections.Generic;
 3 using System.Text;
 4 
 5 namespace Delegate
 6 {
 7     // 热水器
 8     public class Heater
 9     {
10         private int temperature;
11         public string type = "RealFire 001";       // 添加型号作为演示
12         public string area = "China Xian";         // 添加产地作为演示
13         public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e);         //声明委托
14         public event BoiledEventHandler Boiled;    //声明事件      
15         public class BoiledEventArgs : EventArgs     // 定义BoiledEventArgs类,传递给Observer所感兴趣的信息
16         {
17             public readonly int temperature;
18             public BoiledEventArgs(int temperature)
19             {
20                 this.temperature = temperature;
21             }
22         }
23         protected virtual void OnBoiled(BoiledEventArgs e)   // 可以供继承自 Heater 的类重写,以便继承类拒绝其他对象对它的监视
24         {
25             if (Boiled != null)
26             {
27                 Boiled(this, e); // 如果有对象注册调用所有注册对象的方法
28             }
29         }
30         public void BoilWater()       //烧水。
31         {
32             for (int i = 0; i <= 100; i++)
33             {
34                 temperature = i;
35                 if (temperature > 95)
36                 {
37                     BoiledEventArgs e = new BoiledEventArgs(temperature);    //建立BoiledEventArgs 对象。
38                     OnBoiled(e);  // 调用 OnBolied方法
39                 }
40             }
41         }
42     }
43     // 警报器
44     public class Alarm
45     {
46         public void MakeAlert(Object sender, Heater.BoiledEventArgs e)
47         {
48             Heater heater = (Heater)sender;     //这里是不是很熟悉呢?        
49             Console.WriteLine("Alarm:{0} - {1}: ", heater.area, heater.type);     //访问 sender 中的公共字段
50             Console.WriteLine("Alarm: 嘀嘀嘀,水已经 {0} 度了:", e.temperature);
51             //Console.ReadLine();
52             //Console.ReadKey();
53            // Console.WriteLine();
54         }
55     }
56     // 显示器
57     public class Display
58     {
59         public static void ShowMsg(Object sender, Heater.BoiledEventArgs e)
60         {   //静态方法
61             Heater heater = (Heater)sender;
62             Console.WriteLine("Display:{0} - {1}: ", heater.area, heater.type);
63             Console.WriteLine("Display:水快烧开了,当前温度:{0}度。", e.temperature);
64             //Console.ReadLine();
65             Console.ReadKey();
66             Console.WriteLine();
67         }
68     }
69 
70     class Program
71     {
72         static void Main()
73         {
74             Heater heater = new Heater();
75             Alarm alarm = new Alarm();
76             //heater.Boiled += alarm.MakeAlert;   //注册方法
77            // heater.Boiled += (new Alarm()).MakeAlert;      //给匿名对象注册方法
78            // heater.Boiled += new Heater.BoiledEventHandler(alarm.MakeAlert);    //也可以这么注册
79             heater.Boiled += Display.ShowMsg;       //注册静态方法
80             heater.BoilWater();   //烧水,会自动调用注册过对象的方法
81             Console.ReadKey();
82         }
83     }
84 }
View Code

 

1.将方法作为方法的参数

public void GreetPeople(string name) {
    // 做某些额外的事情,比如初始化之类,此处略
    EnglishGreeting(name);
}
public void EnglishGreeting(string name) {
    Console.WriteLine("Morning, " + name);
}

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,

这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,

同时使得程序具有更好的可扩展性。

 

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇ODBC驱动程序丢失解决方法 下一篇[原创][Windows] Win7安装visual ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目