组件重用包容与聚合.ppt

  1. 1、本文档共35页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
组件重用包容与聚合

组件重用:包容和聚合 杨之江 yangzhijiang@mapgis.net 内容 组件重用 包容 聚合 包容的实现 聚合的实现 QA 组件重用 继承 实现继承: 一个类继承其基类的代码或实现 COM不支持实现继承而受到批评 接口继承: 一个类继承其基类的类型或接口 COM不支持实现继承的原因: 一个对象的实现同另一个对象的实现紧紧关联 COM规范:组件客户不能因组件的变化而受到影响 COM使用包容来完全模拟实现继承 组件的可重用性 一个COM对象如何重用已有的COM对象的功能,而不是重复实现老的功能 COM的两种重用模型:包容和聚合 COM组件建立重用的关键 : 建立在二进制代码级上 建立在组件对象的行为方式的基础上,而不在具体的实现上 组件重用实质及遵循规则 包容和聚合实际上一个组件使用另外一个组件 外部组件 内部组件 外部组件包容(或聚合)内部组件 遵循规则: 查询时间无关性 IUnkown必须唯一 QueryInterface必须是反身的、对称的和可传递的 包容(Containment) 基本思想:某个对象完全重实现其他对象的接口,遵循“任何COM对象都可以作为其他对象的客户” 当一个组件(外部组件)包容另一个组件(内部组件)时,外部组件包含全部或部分内部组件接口的指针。此时,外部组件的接口作为内部接口的一个客户,使用内部组件的接口来实现它自己的接口功能。在调用外部组件的某个接口时,实际上外部组件只是简单的将这个调用请求转发给内部组件,利用内部组件的相应接口实现外部组件这个接口的功能。并且外部组件还可以在调用内部组件之前加上自己的代码,进行附加的处理的改进 对象包容示意图 聚合(Aggregation) 聚合是包容的一个特例。当一个外部组件聚合了某个内部组件的一个接口时,它并没有像包容一样重新实现此接口,并将调用请求转发该内部组件,而是将该内部组件的接口指针直接返回给客户。 使用此方法,外部组件无需重新实现并转发接口中的所有方法,但无法对接口中的方法进行任何改造。当外部组件将内部组件的接口指针返回给客户后,客户就可以直接同内部组件接口打交道了 注意: 聚合只对进程内组件起作用 必须符合COM规范 对象聚合示意图 包容的实现 (1)示意图 (2) 包容类声明 class Ccontainer:public IMultiply,public ISum { //Methods and data go here... }; [ object, uuid0000-0000-0000-000000000001) ] interface IMultiply:IUnknown { HRESULT Multiply(int x,int y,[out,retval]int*retval); } (3) 内部组件对象实例化 HRESULT CContainer::Init() { return CoCreateInstance(CLSID_InsideCOM,NULL, CLSCTX_INPROC_SERVER,IID_ISum,(void**)m_pSum); } HRESULT CFactory::CreateInstance(IUnknown *pUnknownOuter, REFIID riid, void** ppv) { if(pUnknownOuter != NULL) return CLASS_E_NOAGGREGATION; CContainer *pContainer = new CContainer(); if(pContainer == NULL) return E_OUTOFMEMORY; pContainer-Init(); HRESULT hr = pContainer-QueryInterface(riid, ppv); pContainer-Release(); return hr; } (4) 外部对象的QueryInterface 外部对象不将直接的(内部的)接口指针交给客户,不违反COM接口规范 HRESULT CContainer::QueryInterface(REFIID riid, void** ppv) { if(riid == IID_IUnknown) { //*ppv = reinterpret_castIUnknown*(this); //*ppv = static_castISum*(

您可能关注的文档

文档评论(0)

yx118 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档