面向对象事件(Delegate)机制

来源:互联网 发布:淘宝上好吃的零食 编辑:程序博客网 时间:2024/05/02 01:16
一、DotNet(C#)函数回调。
        在DotNet中实现函数调用是通过委托(delegate)实现的,首先你要声明委托原型:
    
delegate void Notify( int newValue );

      这样就声明了一个委托,那到底什么是委托呢?其实委托就是一个回调函数(更确切的说委托是一个安全的函数指针)。当需要回调的时候。可以调用委托的成员函数 Invoke 就可以实现调用你设置的回调函数。这时Invoke会自动根据你声明的委托形式进行调用。在这里我们举一个例子,压力计、报警器的例子:

当压力计的压力指数变化的时候,报警器会报警,并打印出变化的压力值。代码如下
 1using System;
 2using System.Collections.Generic;
 3using System.Text;
 4
 5namespace ConsoleApplication2
 6{
 7    // 这里声明委托
 8    public delegate void Notify( int newValue );
 9
10    // 压力计
11    class Piezometer
12    {
13        // 压力值
14        private int m_PressureNumber;
15        public int PressureNumber
16        {
17            get
18            {
19                // 返回当前压力值
20                return this.m_PressureNumber;
21            }

22            set
23            {
24                // 设置新的压力值
25                this.m_PressureNumber = value;
26                // 判断是否有人注册该事件,如果有就调用并传入新的压力值。
27                if (OnPressureChanged != null)
28                {
29                    // 这里就是DotNet框架实现的委托好处,它可以根据
30                    // 声明的形式自动匹配调用的参数表和返回值。
31
32                    // 调用回调事件,将新的压力值传入
33                    OnPressureChanged.Invoke(value);
34                }

35            }

36        }

37
38        // 声明一个事件,当压力值变化的时候触发该事件
39        public event Notify OnPressureChanged;
40    }

41
42    // 报警器
43    class Alerter
44    {
45        // 设置监听的压力计
46        public void Listen(Piezometer piezometer)
47        {
48            // 注册压力计压力变化事件
49            piezometer.OnPressureChanged += new Notify(OnChanged);
50        }

51        // 这里就是压力计变化后调用的函数
52        public void OnChanged(int newValue)
53        {
54            // 打印出新的压力值
55            Console.WriteLine(string.Format("New PressureNumber is {0}.", newValue));
56        }

57    }

58
59    class Program
60    {
61        static void Main(string[] args)
62        {
63            Alerter alerter = new Alerter();
64            Piezometer piezometer = new Piezometer();
65
66            // 安装压力计,进行监听
67            alerter.Listen(piezometer);
68
69            // 设置新的压力值,报警器就会打印出新的压力值。
70            piezometer.PressureNumber = 10;
71        }

72    }

73}

74

根据上面的代码我们可以实现自己的自定义事件。
 

原创粉丝点击