设为首页 加入收藏

TOP

9.9.7 委托和事件(2)
2013-10-07 12:40:37 来源: 作者: 【 】 浏览:65
Tags:9.9.7 委托 事件

9.9.7  委托和事件(2)

第一条语句创建一个对象,第二条语句为HandlerClass对象obj创建一个指向Fun3()函数的委托。该委托要求提供int类型的实参,因此我们可以用下面这条语句来调用它:

  1. handler2(70); 

该语句以70为实参,为obj对象调用Fun3()函数,因此输出如下:

  1. Function3 called with value 71 

obj对象的value字段中存储的数值是1,因为我们是使用默认构造函数创建该对象的。Fun3()函数体中的语句将value字段与函数的实参相加,因此输出的结果是71。

因为两个委托对象的类型相同,所以我们可以合并handler的调用列表与handler2委托的调用列表:

  1. Handler^ handler = gcnew Handler(HandlerClass::Fun1); 
    // Delegate object  
  2. handler += gcnew Handler(HandlerClass::Fun2);  
  3.  
  4. HandlerClass^ obj = gcnew HandlerClass;  
  5. Handler^ handler2 = gcnew Handler (obj, &HandlerClass::Fun3);  
  6. handler += handler2; 

这里创建的handler刚开始引用的委托包含指向静态函数Fun1()和Fun2()的指针。之后,我们创建了一个新的仍然由handler引用的委托,除两个静态函数之后,该委托还包含供obj使用的实例函数Fun3()。现在,我们可以用下面这条语句来调用这个新委托:

  1. handler(50); 

该语句产生下面的输出:

  1. Function1 called with value 50  
  2. Function2 called with value 50  
  3. Function3 called with value 51 

我们看到,对该委托的调用调用了两个静态函数和obj对象的Fun3()成员,这说明我们可以在委托的单个调用列表中合并静态和非静态的函数。

下面将这些代码段放入一个示例中,以确保它们确实能够正常工作。

试一试:创建和调用委托

下面是我们迄今所看到的与委托有关的代码:

  1. // Ex9_17.cpp : main project file.  
  2. // Creating and calling delegates  
  3.  
  4. #include "stdafx.h"  
  5.  
  6. using namespace System;  
  7.  
  8. public ref class HandlerClass  
  9. {  
  10. public:  
  11. static void Fun1(int m)  
  12. { Console::WriteLine(L"Function1 called with value {0}", m); }  
  13.  
  14. static void Fun2(int m)  
  15. { Console::WriteLine(L"Function2 called with value {0}", m); }  
  16.  
  17. void Fun3(int m)  
  18. { Console::WriteLine(L"Function3 called with value {0}", m+value); }  
  19.  
  20. void Fun4(int m)  
  21. { Console::WriteLine(L"Function3 called with value {0}", m+value); }  
  22.  
  23. HandlerClass():value(1){}  
  24.  
  25. HandlerClass(int m):value(m){}  
  26. protected:  
  27. int value;  
  28. };  
  29.  
  30. public delegate void Handler(int value); // Delegate declaration  
  31.  
  32. int main(array<System::String ^> ^args)  
  33. {  
  34. Handler^ handler = gcnew Handler(HandlerClass:
    :Fun1); // Delegate object  
  35. Console::WriteLine(L"Delegate with one pointer 
    to a static function:");  
  36. handler->Invoke(90);  
  37.  
  38. handler += gcnew Handler(HandlerClass::Fun2);  
  39. Console::WriteLine(L"\nDelegate with two pointers 
    to static functions:");  
  40. handler->Invoke(80);  
  41.  
  42. HandlerClass^ obj = gcnew HandlerClass;  
  43. Handler^ handler2 = gcnew Handler (obj, &HandlerClass::Fun3);  
  44. handler += handler2;  
  45. Console::WriteLine(L"\nDelegate with three pointers to functions:");  
  46. handler(70);  
  47.  
  48. Console::WriteLine(L"\nShortening the invocation list...");  
  49. handler -gcnew Handler(HandlerClass::Fun1);  
  50. Console::WriteLine  
  51.        (L"\nDelegate with pointers to one static
    and one instance function:");  
  52. handler(60);  

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇9.9.7 委托和事件(3) 下一篇9.9.7 委托和事件(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: