您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码:  验证码,看不清楚?请点击刷新验证码 必填



  求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
   
业务架构设计
4月18-19日 在线直播
基于UML和EA进行系统分析设计
4月25-26日 北京+在线
AI 智能化软件测试方法与实践
5月23-24日 上海+在线
     
   
 
 订阅
大话OO之解析委托
 
作者:唐俊
   次浏览      
  2007-12-06
 
编辑推荐:
本文主要介绍面向对象分析与设计及面向程序设计语言中委托的使用,希望对您的学习有所帮助。
本文来自于希赛网,由火龙果软件Linda编辑、推荐。

面向对象与其说是技术不如说是一种理念,各种面向对象语言或多或少有些差异,但是面向对象的理念却是不变的。在面向对象的定义中并没有委托这个概念,但是委托却是目前的面向对象分析与设计及面向程序设计语言中的必含内容。

MSDN对委托的定义如下:The delegate keyword is used to declare a reference type that can be used to encapsulate a named or an anonymous method. Delegates are similar to function pointers in C++; however, delegates are type-safe and secure。对于这样的定义,我们可以了解到委托是一种引用,就跟C++中的函数指针一样,只是委托比指针更加安全,不会发生那种指向不正确的内存地址这样的错误。

如果要从编程的角度来理解委托,确实可以更快一点,但是这样很难理解委托的真正实质。既然有委托,那么就有“委托人”与“被委托”人,那么找出面向对象中的委托人和被委托人就成了理解委托的关键。被委托人是帮助委托人进行本来委托人该做的事情,就比如以前在DOS下编程,需要判断键盘是否有某个健被按下,那么在程序中需要做一个循环,在循环内时刻对键盘扫描码进行获取并判断,这种方式称为轮询。在WIN32编程中也有回调函数这样一个特殊的函数进行系统消息的轮询,一个典型的回调函数如下:

LRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
    {
        switch(message)
        {
        case WM_PAINT:
            ……
            return 0;
        case WM_DESTROY:
            ……
            return 0;
        default:
            ……
        }
    return -1;
    }
  

一旦操作系统有消息发送过来,由回调函数进行处理,看是否有应用程序所需要的消息,如果有则执行相应case 语句中的代码,否则将交给操作系统进行更底层的消息处理。

如果没有回调函数,那么操作系统的事件则只能直接发送给应用程序中的每一个处理方法,如下图所示。

引入了回调函数后,处理的方法如下:

有了回调函数后,操作系统只需要将用户所触发的消息发往回调函数,而不需要管该发什么,该发给谁,而全部由应用的回调函数来决定由谁处理,这样操作系统与应用程序的耦合程度便大大降低了,操作系统不需要知道应用程序的结构,而应用程序必须提供一个与操作系统约定好了格式的回调函数。

根据委托人不做事情,而由被委托人来做,可以判断出回调函数的身份是“委托人”,而回调函数中调用的方法则是真正做事情的“被委托人”。那么在.NET中干脆去掉了WIN32种让人费解的回调函数,而采用了委托来处理操作系统发送过来的消息。

在.NET的Windows程序中,向窗体中的控件添加一个事件就会产生一条代码,如:this.button1.Click += new System.EventHandler(this.button1_Click);

委托在.NET的事件处理程序中被隐含的定义,我们看不到定义的代码,但是操作系统将消息发送给程序的时候不需要知道程序处理方法的名称,他只需要大喊一声“某某键被按下拉!”,就会由相应的委托接受到消息,并触发委托对应的方法的执行。跟回调函数不同,委托并不是将所有的消息都接受,并可以调用不同的方法。委托只能调用格式相同的方法,如果要委托既能调用一个参数的方法又能调用多个参数的方法则行不通。

在.NET中,委托已经由应用程序框架定义好了,我们只需要编写处理方法,并使用委托的+=操作符将委托人与被委托人联系起来就可以,当然一个委托人可以找多个被委托人,一个被委托人也可以接受多个委托人的委托。


   
次浏览       

最新活动计划
业务架构设计与建模 4-18[北京]
DeepSeek大模型开发实践 4-19[在线]
基于 UML 和EA进行分析设计 4-26[北京]
产品经理与产品管理 5-8[上海]
AI智能化软件测试方法与实践 5-23[上海]
图数据库与知识图谱 5-22[北京]
 
 
最新文章
iPerson的过程观:要 过程 or 结果
基于模型的需求管理方法与工具
敏捷产品管理之 Story
敏捷开发需求管理(产品backlog)
Kanban看板管理实践精要
最新课程
基于iProcess的敏捷过程
软件开发过程中的项目管理
持续集成与敏捷开发
敏捷过程实践
敏捷测试-简单而可行
更多...   
成功案例
英特尔 SCRUM-敏捷开发实战
某著名汽车 敏捷开发过程与管理实践
北京 敏捷开发过程与项目管理
东方证券 基于看板的敏捷方法实践
亚信 工作量估算
更多...