代理是对函数进行包装的对象.docx
《代理是对函数进行包装的对象.docx》由会员分享,可在线阅读,更多相关《代理是对函数进行包装的对象.docx(9页珍藏版)》请在优知文库上搜索。
1、代理是对函数进行包装的对象在C+/C1.I中,代理是对函数进行包装的对象;而事务是一种为客户程序供应通知的类机制。在前几篇文章中,已经多次演示了假如让一个句柄在不同的时间,被引用至不同的对象,从而以更抽象的方法来解决程序中的问题,但是,也能运用代理通过函数来达到同样的效果;代理是包装r函数的一个对象,且而实例函数而言,也能通过特定的实例,与这些函数发生联系。一旦一个代理包装r-个或多个函数,你就能通过代理来调用这些函数,而无须事先了解包装了哪些函数。请看例1中的代码,在标号1中,定义一个代理类型De1.,由于运用了上下文关键字de1.egate,所以有点像函数的声明,但与函数声明不同的是,此处
2、声明的是一个代理类型De1.的实例,其可包装进随意接受一个int类型作为参数并返回一个ini值类型的函数(随意有效的参数列衣及返回类型组合都是允许的)。一旦定义了某种代理类型,它只能被用于包装具有同样类型的函数;代理类型可被定义在源文件中或命名空间的范围内,也能定义在类中,并可有pub1.ic或private访问限制属性。例1:usingnamespaceSystem;refstructA(staticintSquare(inti)returni*i;refstructBintCube(inti)(returni*i*i;/*1*/de1.egateintDe1.(intva1.ue);int
3、main()相同的参数类型及返回类型,因此它们能被包装进同类型的代理中。留意,即使两个函数均为pub1.ic,当考虑它们与De1.的赖容性时,它们的可访问性也是不相关的,这样的函数也能被定义在相同或不同的类中,主要由程序员来选择。一旦定义了某种代理类型,就可创建此类型实例的句柄,并进行初始化或赋值操作,如标号2中所示的静态函数A-Square,及标号5中所示的实例函数BiiCubeo(此处只是出于演示的目的,否则把Cube做成实例函数没有任何好处。)创建一个代理实例涉及到调用一个构造函数,假如是在包装一个静态函数,只需传递进一个指向成员函数的指针:而对实例函数而言,必需传递两个参数:一个实例的
4、句柄及指向实例成员函数的指针。在初始化代理实例之后,就能间接地调用它们包装的函数了,用法与干脆调用原函数一样,只不过现在用的是代理实例名,如标号3与6,由包装函数返回的他也是像干脆调用函数时那样获得。假如一个代理实例的值为11u1.1.ptr,此时再试图调用被包装的函数,会导致System:INu1.1.ReferenceException类型异样。以下是输出:d(10)resu1.t=100d(10)resu1.t=1000传递与返回代理有时,把包装好的函数传递给另一个函数,会特别有用,接受一方的函数并不知道会传递过来哪个函数,并且它也无须关切,只需简洁地通过包装好的代理,间接调用此函数就行
5、了。下面以集合中元素排序来说明,reCase在标号6中,创建了一个Compare代理类型的实例,用它来包装StrCOmPare:=CompareIgnoreCase,并把此代理句柄传递给Sort函数,其将会利用比较函数进一步进行处理。正如大家所看到的,Sort可接受一个代理类型的参数一而此参数可像其他函数参数一样,可为传值、传址、传引用。在标号7中,调用了FindCompariSonMethod函数,其返回一个De1.代理类型,接着在标号7及8中调用了包装过的函数。此处要重点说一下标号8:首先,FindCompariSonMethod函数是被调用来获得代理实例一其常用于调用底层函数:其次,这两
6、个函数的调用操作符都有同等的优先级,所以它们从左至右调用。FindCompariSonMethod函数中也用了一些逻辑用于确定究竟须要包装哪个函数,此处就未作具体说明白。代理类型的赖容性一个代理类型只与它自身相兼容,与其他任何代理类型都不兼容,即使其他类型的包装函数均为同一类型。请看例3,特别明显,代理类型D1.与函数A:M1与A:M2兼容,代理类型D2也与这些函数兼容,然而,这两个代理类型在标号5、6、8、9中并不能互换运用。例3:de1.egatevoidD1();de1.egatevoid)2();pub1.icstructstaticvoidM1.O*.*/sta兼容/*5*/d1.=
7、d2;不兼容/*6*/d2=d1.;/不兼容/*7*/X(d1.);兼容/*8*/X(d2);不兼容*9*/Y(d1.);不兼容/*10*/Y(d2):兼容代理类型的合并一个代理实例事实上能包装多个函数,在这种状况下,被包装的函数集被维护在一个调用列表中,当合并两个代理实例时,它们的调用列表也以指定的依次连接起来,并产生一个新的列表,而现有的两个列表并没有发生变更。当从调用列表中移除一个或多个函数时,也会产生一个新的列表,且原始列表不会发生变更。请看例4中的代码,每个函数调用后的输出都写在相应函数后。例4:usingnamespaceSystem:de1.egatevoidD(intx);re
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 代理 函数 进行 包装 对象
