面向对象事件(Delegate)机制
来源:互联网 发布:淘宝上好吃的零食 编辑:程序博客网 时间:2024/05/02 01:16
一、DotNet(C#)函数回调。
在DotNet中实现函数调用是通过委托(delegate)实现的,首先你要声明委托原型:
这样就声明了一个委托,那到底什么是委托呢?其实委托就是一个回调函数(更确切的说委托是一个安全的函数指针)。当需要回调的时候。可以调用委托的成员函数 Invoke 就可以实现调用你设置的回调函数。这时Invoke会自动根据你声明的委托形式进行调用。在这里我们举一个例子,压力计、报警器的例子:
当压力计的压力指数变化的时候,报警器会报警,并打印出变化的压力值。代码如下
在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
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
根据上面的代码我们可以实现自己的自定义事件。
- 面向对象事件(Delegate)机制
- 深入探索面向对象事件(Delegate)机制
- 深入探索面向对象事件(Delegate)机制
- 深入探索面向对象事件(Delegate)机制
- 深入探索面向对象事件(Delegate)机制
- 深入探索面向对象事件(Delegate)机制
- 用面向对象的思想理解as的事件机制
- 委托(Delegate)机制
- 面向对象整体机制的思考(什么事面向对象)
- Unity3D事件派发机制之Delegate
- VBS 面向对象事件
- js事件:面向对象
- 面向对象写拖拽事件
- 面向对象-异常机制
- 事件/委托机制(event/delegate)(Unity3D开发之十七)
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之间的通信
- 在Unity中使用事件/委托机制(event/delegate)进行GameObject之
- delegate机制
- ilogger的tiny wiki
- 在Vs.net中使用MSN即时通讯软件
- 使用SerialPort类设计串口通讯程序
- 改变一生的五句话
- Windows XP 快上几倍的三招
- 面向对象事件(Delegate)机制
- 我们来上海做什么?
- 创建Linked ValidationSummary, 深入理解ASP.NET的Validation
- 到今天为止遇到的问题
- 服务器结构探讨 -- 登录服的负载均衡
- static用法总结
- Set-PSDebug 帮助信息
- J2EE 面试题集锦
- 让敏捷方法和企业架构和谐共舞[转]