描述:
我正在看《COM技术内幕》,看到136页的《聚合》的时候就看不明白了,136~137页的内容能不能给讲一下啊,
尤其是为什么内部组件需要两个IUnknown接口,用一个不行么??哪位大侠能把关键问题点一下不胜感激。
谢谢!!!
mail: boku999@hotmail.com
解决方案1:
天那 这么简单的东西 小子你多读两遍书吧 很简单
解决方案2: up 呵呵我也在看这本书
我是自己用土办法聚合的,没有用到OleClientSite这些接口。
好像没有遇到这个问题。不过我的子组件自己是相对独立的。我的做法是,如果大组件里面嵌套小组件,让他们互相可以相互查询到接口。通常是一个第三方的独立接口。
当小组件要执行某个可能需要环境语义支持的verb的时候,就去查询那个特殊的接口,如果找不到,就执行自己的独立的方法,否则就把第三方接口考虑进来进行执行。
不过,也能够很稳定的工作。
up
解决方案5: 真的不是不想告诉你,但是由你自己历经百折想清楚,这个过程是你升华自己程序设计能力的重要步骤。
聚合这个问题是很有意思的,你不妨自己试着做一点C++代码实现一下这个模型就会一清二楚,相信你自己,一定可以搞定的。
楼主考虑一下这个问题:组件A与组件B,组件B有接口IX,IY,IZ。组件A只聚合组件B的IX接口,可是楼主那样的实现,组件A就可以通过聚合的IX接口得到接口IY,IZ,你怎么解决这个问题?
解决方案7: 嘿嘿,这个地方我当初也反复看了N遍,绕来绕去的,不容易理解...
书读百遍,其义自现...
首先你要确信,你是错的...
举个例子,组件A需要聚合组件B的接口IX,而组件B还实现了接口IY
因为聚合的关系,客户可以通过组件A取得接口IX,那如果按楼主的想法客户又可以通过刚得到的IX指针得到接口IY,根据接口的定义必须满足对称性的,那就是说可以通过IY接口得到组件A的接口,但组件B又没有聚合组件A,所以这显然是错误的。
我也在看这本书,共同学习。
即使在被聚合的情况下,内部组件自己单独的IUnknown还是有用的,有什么用呢?——就是专门给外部对象控制用的。这时,只有外部对象可以调用内部对象自己的IUnknown接口来实现对内部对象的控制。——这样,客户并不知道也不需要知道聚合这个事实,但问题是外部对象自己必须知道。
否则,如果外部对象也企图调用内部对象的外部IUnknown接口,——即间接地调用外部对象自己的IUnknown接口来控制内部对象的话,就引起了无限递归。
因为内部组件可能被单独使用,所以他需要一套接口(比如共有IA,IB,IC加上IUnknown)。另外当他被聚合时,外部组件定制了这个组件可以暴露的接口(比如只能暴露IA)。那么当客户得到一个IA接口的时候,他并不知道这个组件是单独还是聚合,在单独时,对IA查询IUnknown得到他的一个IUnknown接口,在聚合时他应该得到另一个IUnknown接口,因为这两个IUnknown接口暴露的是不同的接口集合
解决方案11:UP