- 1、本文档共35页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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*(
您可能关注的文档
- 第十章 发展中国家的贸易政策 25.ppt
- 第十章 建设中国特色社会主义文化PPT3.ppt
- 第十章 水污染及其控制6.ppt
- 第十章 抗震设计基本概念5.ppt
- 第十章 指针§10.1 指针的概念.ppt
- 第十章 苏宁电器 传统零售业电子商务的代表 26.ppt
- 第十章-土地增值税法(二).docx
- 第十章 除草剂残留分析9.ppt
- 第十章-契税法.docx
- 第十章二十世纪现实主义文学2.ppt
- 专题17 中国特色社会主义道路(第01期)-中考历史模拟题分项汇编(全国通用)(原卷版).docx
- 专题17 中国特色社会主义道路(第01期)-中考历史模拟题分项汇编(全国通用)(解析版).docx
- 专题20 宾语从句---三年(2024-2024)中考模拟题英语分项汇编(全国通用).docx
- 专题18 民族团结与祖国统一国防建设与外交成就(第01期)-2024年中考历史模拟题分项汇编(原卷版).doc
- 专题18 民族团结与祖国统一国防建设与外交成就(第02期)-2024年中考历史模拟题分项汇编(全国通用)(解析版).docx
- 专题15 中华人民共和国的成立和巩固(第02期)-中考历史模拟题分项汇编(全国通用)(解析版).docx
- 专题12 中华民族的抗日战争(第01期)-中考历史模拟题分项汇编(原卷版).doc
- 专题12 中华民族的抗日战争(第01期)-中考模拟题历史试题分项汇编(解析版).doc
- 专题12 中华民族的抗日战争(第02期)-中考历史模拟题分项汇编(全国通用)(原卷版).docx
- 专题12 中华民族的抗日战争(第02期)-中考历史模拟题分项汇编(全国通用)(解析版).docx
文档评论(0)