已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1,4、包含与聚合,如果一个构件B使用另外一个构件A 我们称使用者B为:外部构件 被使用者A为:内部构件则:外部构件B包含(聚合)内部构件A包含与聚合是COM的两种复用方式(模型)为系统升级、扩展提供支持,包含与聚合,2,(1)包含与聚合简介(2)包含的实现(3)聚合的实现(4)例子,包含与聚合,3,(1)包含与聚合简介,包含(Containment),对象A,对象B,IY,IX,IX,包含与聚合,4,对象 B 的成员函数在调用对象A的接口之前或之后可以进行其他一些操作IX提供的功能可以超过IX对象B是对象A 的客户而对象B的客户看到的只是对象B显露出的接口(IY、IX)对象A的创建与释放完全在对象B内部进行对象A的生命期包含在对象B的生命期内,包含与聚合,5,对象A,对象B,聚合(Aggregation),IY,IX,包含与聚合,6,可以将聚合看作是包含的一个特例更好地体现了复用 虽然对象A直接向对象B的客户提供服务 但 对象B的客户感觉不到对象A的存在对象A的生存期受到对象B的控制实现聚合的关键在于 QueryInterface:当客户向对象B请求IX时对象B的QueryInterface返回对象A的IX指针存在问题: (1)从IX如何得到IY?(2)从IX得到的Iunknown如何与从IY得到的IUnknown 相同?,包含与聚合,7,包含的复用性建立在客户/服务器模式上聚合的复用性需要内部构件提供支持复用方式的选择:当内部构件提供的接口完全满足要求时使用聚合合适当内部构件提供的接口与需求类似时使用包含合适在一个对象中可以同时使用两种复用方式,包含与聚合,8,(2)包含的实现,假定IX、IY的定义分别为:class IX:public IUnknown public : virtual HRESULT _stdcall FX() =0;class IY:public IUnknown public : virtual HRESULT _stdcall FY() =0;,包含与聚合,9,对象B的定义为:class CB: public IX, public IY protected: ULONG m_ref;public: CB(); CB(); / IUnknownvirtual HRESULT _stdcall QueryInterface(const IID,包含与聚合,10,类B的实现: CB:CB()m_pIX = null;m_Ref = 0; CB:CB()if (m_pIX != null) m_pIX-Release();HRESULT CB:Init() HRESULT result = :CoCreateInstance(CLSID_ComponentA,null, CLSCTX_INPROC_SERVER,IID_ISomeInterface,(void *),包含与聚合,11,包含的主要用途:扩展接口 假定想把一个 Iairplane接口扩展为 IFloatPlane:定义:interface Iairplane: Iunknownvoid Takeoff();void fly();void Land();interface IFloatPlane: Iairplane void Float();void Sink();void Rust();void DrainBankAccount();,包含与聚合,12,(3)聚合的实现,对象B的定义为:class CB: public IY protected: ULONG m_ref;public: CB(); CB(); / IUnknownvirtual HRESULT _stdcall QueryInterface(const IID,包含与聚合,13,HRESULT _stdcall CB:QueryInterface(const IID,包含与聚合,14,问题:,QueryInterface,AddRef,Release,Fy,QueryInterface,AddRef,Release,Fx,IY,IX,内部构件的IUnknown实现,外部构件的IUnknown实现,内部构件,外部构件,包含与聚合,15,解决方法:将内部构件的IUnknown接口进行隐藏使内部构件的接口调用外部接口的IUnknown接口这样,内部构件将实现两个IUnknown接口一个是“非代理未知接口”按一般方式实现IUnknown接口一个是“代理未知接口”如果内部构件未被聚合则代理未知接口将调用转发给非代理未知接口如果内部构件被聚合代理未知接口将调用转发给外部构件实现的未知接口,包含与聚合,16,CoCreateInstance与IClassFactory中的pIUnknownOuter:HRESULT_stdcall CoCreateInstance(const CLSID,包含与聚合,17,QueryInterface,AddRef,Release,Fx,IX,代理Iunknown实现,非聚合构件,非代理Iunknown实现,包含与聚合,18,QueryInterface,AddRef,Release,Fy,QueryInterface,AddRef,Release,Fx,IY,IX,代理Iunknown的实现,外部构件的IUnknown实现,内部构件,外部构件,非代理Iunknown的实现,包含与聚合,19,内部构件的创建 涉及三个函数: 外部构件的 Init 函数内部构件类厂的CreateInstance内部构件的构造函数外部构件的 Init 函数:HRESULT _stdcall CB:Init() IUnknown * pUnknownOuter = this;HRESULT hr = CoCreateInstance(CLSID_ComponentA, pIUnknownOuter,CLSCTX_INPROC_SERVER,IID_IUnknown, (void * ) ,包含与聚合,20,内部构件类厂的CreateInstance:HRESULT _stdcallCfactory:CreateInstance( IUnknown * pUnknownOuter,const IID ,包含与聚合,21,内部构件的构造函数:,CB:CB(IUnknown * pUnknownOuter):m_cRef(1) :InterlockedIncrement( ,包含与聚合,22,对外部构件Init的补充HRESULT _stdcall CB:Init() IU
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 管理学原理第三章模拟试题与答案
- 健康管理师考试模拟题与答案
- 火灾应急预案实操测试题及答案参考
- 咖啡行业顾客体验优化考试题集及解答
- 环保法律法规知识题库及答案指南
- 建筑电气安全知识培训试题集与答案解析
- 建筑工程管理标准化流程手册与试题集
- 建筑工地施工安全测试题及答案
- 电子商务网站建设题库及答案手册
- 精神健康手册心理健康状态自测题及答案详解
- 施工生产管理培训课件
- 算力中心建设项目施工方案
- 早产儿生后黄金1小时管理
- 2025年大队委员笔试题库及答案
- 2025年网球理论基础知识考试题及答案
- 2025江西吉安市遂川县城控人力资源管理有限公司招聘34人笔试考试参考试题及答案解析
- 初中期中质量分析会校长讲话:正视短板精准发力共筑初中教学质量新高度
- 2025-2026学年度上学期一中高三11月月考物理试卷
- 苏炳添的精神
- 2025版皮肤科疾病常见症状及护理培训
- 吉林省长春市东北师范大学附属实验学校(经开)2024-2025八年级下期初数学考试(含答案)
评论
0/150
提交评论