UML软件工程组织

 

 

大话OO之解析委托
 
2007-12-06 作者:唐俊 来源:希赛网
 

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

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

 

组织简介 | 联系我们 |   Copyright 2002 ®  UML软件工程组织 京ICP备10020922号

京公海网安备110108001071号