使用委托(Delegate)实现回调通知

ZDNet软件频道 时间:2003-01-17 作者:陶刚 |  我要评论(1)
本文关键词:
委托(Delegate)是微软.NET框架中的临界特征,对许多程序员来说都需要学习。你也许要花较长时间来掌握它,但是一旦学会了怎样使用它来编程,便会发现它提供的功能强大无比。

委托(Delegate)是微软.NET框架中的临界特征,对许多程序员来说都需要学习。你也许要花较长时间来掌握它,但是一旦学会了怎样使用它来编程,便会发现它提供的功能强大无比。

首先,你应该知道在.NET框架中的事件(event)位于委托的顶层。当你使用类似Windows Forms或 ASP.NET等事件驱动应用框架时,你对委托的了解将使你成为一个更得心应手的开发者。在.NET中,委托为使用异步方式执行另一个线程中的方法提供了主要途径。因此,委托开启了多线程编程之门。

委托反映了.NET的一种革新,即试图访问包含回调通知(callback notification)的应用设计。本文我将演示怎样使用委托实现回调。但是在用委托编程前,我将解释一下过去回调通知为什么实现和怎样实现。

回调通知

应用软件通常设计成包含回调的概念。使用回调是一种编程技术,在回调中,一旦发生了有关系的事情,程序的一部分就发送通知告知其它部分。更特殊的是,回调是由一个或多个处理程序实现的方法,由通知源来执行。

大多数使用Visual Basic的程序员应该熟悉回调的概念,因为Visual Basic一直支持事件处理的风格。事件处理程序就是回调方法的一个简单例子。当你给命令按钮的Click事件编写事件处理程序时,你实际上是给一个回调方法编写实现代码。但是不需要你明确地调用事件处理程序,Windows Forms框架的Form类代替你作为通知源,因为它在恰当的时机自动地执行了事件处理程序。

类推到日常生活中发生的事情会发现回调设计的好处。比如老板给了你一项任务,假定该任务要几个小时才能完成,而老板想知道你完成的准确时间。这种情况下给老板最合理的建议是“不要呼我,完成后我呼你”。一旦你在完成任务时通知老板,他就能作出反应并及时作出适当的行动。你可以想象,在该情形中回调的使用比老板不断地询问你是否已经完成工作的效率更高。

如果使用Visual Basic .NET或Visual Basic 6.0等早期版本,你能使用接口(interface)实现回调设计。例如,首先你使用接口定义一个回调方法,然后建立一个用于执行该接口的监听类,为了实现该功能,监听类要为处理程序提供一个由接口定义的方法的实现,最后,你能设计另一个对象作为通知源,通知源对象应该设计成跟踪基于接口的引用(reference)进入监听对象,当需要发出回调通知的时候,它能够执行处理方法。

在.NET框架出现之前C++程序员就已经在应用程序中实现了回调。但是C++中的回调一般不用接口实现,而使用调用函数指针来实现。对你来说虽然没有必要了解使用函数指针的下层细节,但是了解较高层次是有用的,因为它对.NET框架的结构有很大的影响。

函数指针是一个位于内存中的指向方法实现的地址。在物理层面,函数指针指向一列方法执行逻辑的指令。为了使用函数指针,应用程序的一部分必须初始化它,将它指向某个特殊的方法,程序的其它部分才能使用该函数指针执行所指向的方法。

在C++中函数指针非常有用,因为它们为在通知源和监听程序间实现回调提供了一条高效的途径。只要通知源获得了一个指向处理方法实现的函数指针,它便能用匿名的方式发出通知。


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134