3 聚合实现.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
3 聚合实现.ppt

4.1.3 聚合实现 对象B聚合对象A,那么实现聚合的关键就在于对象B的QueryInteface成员函数。 对象B支持接口Some和Other,但他并不自己实现Some接口,但在QueryInterface成员函数中,它也接收对接口Some的请求,QueryInterface函数如下: HRESULT CB::QueryInterface(conat IID iid,void ** ppv){ if(iid==IID_IUnknown) { ……} else if(iid==IID_Other) {……} else if(iid==IID_Some) return m_pUnknownInner-QueryInterface(iid,ppv); else{……} return S_OK;} 聚合实现 对象A的IUnknown接口指针m_pUnknownInner成员变量是在对象B构造了对象A之后保存的对对象A的引用,QueryInterface通过它便可以获得对象A的接口指针。 要解决聚合的接口调用与COM接口规范的矛盾的关键在于A的IUknown接口,对象A实现了两个 IUnknown接口,一个用于被聚合的情况,另一个用于正常被客户使用的情形。在被聚合的情况下,客户看不到对象A的IUknown接口,当客户向Some接口请求 IUnknown接口时,被隐藏的 IUnknown接口把外部对象B的 IUnknown接口传递出去,因此,客户程序只看到外部对象的 IUnknown接口。可是内部对象A怎样才能获得外部对象B的 IUnknown接口指针。 HRESULT CoCreateInstance(……); 此函数中的第二个参数pUnknownOuter就是用于被聚合的情况。并且类厂接口的CreateInstance成员函数也包含了这个参数,所以,当外部对象B创建内部聚合对象A时,它把自身的IUknown接口指针传递给内部对象A。内部对象A也可以据此判断自己是否被聚合,如果参数为NULL。则表明没有;否则则有。内部对象A实现两个 IUnknown接口分别用于:委托 IUnknown和非委托 IUnknown(delegating unknown和nondelegating unknown)。 聚合实现 按照通常使用方式实现的 IUnknown为非委托 IUnknown,而委托 IUnknown在不同的情况下有不同的行为:当对象被正常使用时,委托 IUnknown把调用传递给对象的非委托IUnknown;当对象被聚合时,委托IUnknown把调用传递到外部对象的 IUnknown接口,即对象被创建时传递进来的pUnknownOuter参数,并且,这时外部对象通过非委托IUnknown对内部对象进行控制。这两种情况如图4.4和4.5所示。 从图4.4和图4.5中可以看出,委托IUnknown本身并不实现自己的操作,它只是根据不同的情况传递给非委托 IUnknown或者外部对象的IUnknown。而外部对象可以直接控制内部对象的非委托IUnknown。 因为C++类不支持同时实现两个 IUnknown,所以委托 IUnknown和非委托 IUnknown不能都使用 IUnknown类,但在此可以定义一个新的类。因为COM不是通过类名来识别接口,而是通过vtable来调用接口成员函数,因此可以定义一个INondelegationUnknown类来完成和IUnknown类一样的任务。 因为对象A支持聚合,所以它要实现INondelegationUnknown接口。 聚合实现 其中的私有部分为: private: IUnknown * m_pUnknownOuter;//指向外部 IUnknown的指针 在类A中非委托 IUnknown的三个函数的实现与正常情况下的操作一样。 NondelegationAddref和NondelegationRelease函数负责维护引用计数; NondelegationQueryInterface函数负责接口的查询,唯一要注意的是,通过NondelegationQueryInterface函数请求 IUnknown接口指针时,它返回非委托 IUnknown接口指针。 委托接口的实现 委托 IUnknown本身不进行任何操作,它通过m_pUnknownOuter成员函数判断是否被聚合,在聚合的情况下, m_pUnknownOuter指向外部对象的 IUnknown接口,则委托Ikknown把调用传递给m_pUnknownOuter;

文档评论(0)

yanchuh + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档