【编程开发】AspAsp.NetCGIPHPJspXMLPERLC++C#VCVBDelphiPowerBuilderJAVA汇编数据库编程移动开发其它语言

您现在的位置:首页 > 网络学院 > 编程开发 > VC > 实例解析C++/CLI之代理与事件

实例解析C++/CLI之代理与事件

来源: 作者: 日期:2006-12-27

【聚杰网VC】实例解析C++/CLI之代理与事件 在C++/CLI中,代理是对函数进行包装的对象;而事件是一种为客户程序提供通知的类机制。

  在前几篇文章中,已经多次演示了如果让一个句柄在不同的时间,被引用至不同的对象,从而以更抽象的方法来解决程序中的问题,但是,也能使用代理通过函数来达到同样的效果;代理是包装了函数的一个对象,且对实例函数而言,也能通过特定的实例,与这些函数发生联系。一旦一个代理包装了一个或多个函数,你就能通过代理来调用这些函数,而无须事先了解包装了哪些函数。

  请看例1中的代码,在标号1中,定义一个代理类型Del,由于使用了上下文关键字delegate,所以有点像函数的声明,但与函数声明不同的是,此处声明的是一个代理类型Del的实例,其可包装进任意接受一个int类型作为参数并返回一个int值类型的函数(任意有效的参数列表及返回类型组合都是允许的)。一旦定义了某种代理类型,它只能被用于包装具有同样类型的函数;代理类型可被定义在源文件中或命名空间的范围内,也能定义在类中,并可有public或private访问控制属性。

  例1:

using namespace System;
ref struct A
{
 static int Square(int i)
 {
  return i * i;
 }
};
ref struct B
{
 int Cube(int i)
 {
  return i * i * i;
 }
};
/*1*/
delegate int Del(int value);

int main()
{
 /*2*/ Del^ d = gcnew Del(&A::Square);
 /*3*/ Console::WriteLine("d(10) result = {0}", d(10));
 /*4*/ B^ b = gcnew B;
 /*5*/ d = gcnew Del(b, &B::Cube);
 /*6*/ Console::WriteLine("d(10) result = {0}", d(10));
}

  静态函数A::Square与实例函数B::Cube对Del来说,都具有相同的参数类型及返回类型,因此它们能被包装进同类型的代理中。注意,即使两个函数均为public,当考虑它们与Del的兼容性时,它们的可访问性也是不相关的,这样的函数也能被定义在相同或不同的类中,主要由程序员来选择。

  一旦定义了某种代理类型,就可创建此类型实例的句柄,并进行初始化或赋值操作,如标号2中所示的静态函数A::Square,及标号5中所示的实例函数B::Cube。(此处只是出于演示的目的,否则把Cube做成实例函数没有任何好处。)

  创建一个代理实例涉及到调用一个构造函数,如果是在包装一个静态函数,只需传递进一个指向成员函数的指针;而对实例函数而言,必须传递两个参数:一个实例的句柄及指向实例成员函数的指针。

1 2 3 4 5 6 7 下一页

评论   点击查看全部评论
您的评论参与,将为聚杰带来更大的动力!请不要吝啬!
快速回复
请使用文明语言让我们维护健康绿色网络环境!

匿名发表   验证码: