9.9.7 委托和事件(2)
第一条语句创建一个对象,第二条语句为HandlerClass对象obj创建一个指向Fun3()函数的委托。该委托要求提供int类型的实参,因此我们可以用下面这条语句来调用它:
- handler2(70);
该语句以70为实参,为obj对象调用Fun3()函数,因此输出如下:
- Function3 called with value 71
obj对象的value字段中存储的数值是1,因为我们是使用默认构造函数创建该对象的。Fun3()函数体中的语句将value字段与函数的实参相加,因此输出的结果是71。
因为两个委托对象的类型相同,所以我们可以合并handler的调用列表与handler2委托的调用列表:
- Handler^ handler = gcnew Handler(HandlerClass::Fun1);
// Delegate object - handler += gcnew Handler(HandlerClass::Fun2);
-
- HandlerClass^ obj = gcnew HandlerClass;
- Handler^ handler2 = gcnew Handler (obj, &HandlerClass::Fun3);
- handler += handler2;
这里创建的handler刚开始引用的委托包含指向静态函数Fun1()和Fun2()的指针。之后,我们创建了一个新的仍然由handler引用的委托,除两个静态函数之后,该委托还包含供obj使用的实例函数Fun3()。现在,我们可以用下面这条语句来调用这个新委托:
- handler(50);
该语句产生下面的输出:
- Function1 called with value 50
- Function2 called with value 50
- Function3 called with value 51
我们看到,对该委托的调用调用了两个静态函数和obj对象的Fun3()成员,这说明我们可以在委托的单个调用列表中合并静态和非静态的函数。
下面将这些代码段放入一个示例中,以确保它们确实能够正常工作。
试一试:创建和调用委托
下面是我们迄今所看到的与委托有关的代码:
- // Ex9_17.cpp : main project file.
- // Creating and calling delegates
-
- #include "stdafx.h"
-
- using namespace System;
-
- public ref class HandlerClass
- {
- public:
- static void Fun1(int m)
- { Console::WriteLine(L"Function1 called with value {0}", m); }
-
- static void Fun2(int m)
- { Console::WriteLine(L"Function2 called with value {0}", m); }
-
- void Fun3(int m)
- { Console::WriteLine(L"Function3 called with value {0}", m+value); }
-
- void Fun4(int m)
- { Console::WriteLine(L"Function3 called with value {0}", m+value); }
-
- HandlerClass():value(1){}
-
- HandlerClass(int m):value(m){}
- protected:
- int value;
- };
-
- public delegate void Handler(int value); // Delegate declaration
-
- int main(array<System::String ^> ^args)
- {
- Handler^ handler = gcnew Handler(HandlerClass:
:Fun1); // Delegate object - Console::WriteLine(L"Delegate with one pointer
to a static function:"); - handler->Invoke(90);
-
- handler += gcnew Handler(HandlerClass::Fun2);
- Console::WriteLine(L"\nDelegate with two pointers
to static functions:"); - handler->Invoke(80);
-
- HandlerClass^ obj = gcnew HandlerClass;
- Handler^ handler2 = gcnew Handler (obj, &HandlerClass::Fun3);
- handler += handler2;
- Console::WriteLine(L"\nDelegate with three pointers to functions:");
- handler(70);
-
- Console::WriteLine(L"\nShortening the invocation list...");
- handler -= gcnew Handler(HandlerClass::Fun1);
- Console::WriteLine
- (L"\nDelegate with pointers to one static
and one instance function:"); - handler(60);
- }