C# 中的委託和事件

 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);
}ide

委託是一個類,它定義了方法的類型,使得能夠將方法看成另外一個方法的參數來進行傳遞,this

這種將方法動態地賦給參數的作法,能夠避免在程序中大量使用If-Else(Switch)語句,spa

同時使得程序具備更好的可擴展性。code

相關文章
相關標籤/搜索