高级软件工程(包含与聚合).ppt_第1页
高级软件工程(包含与聚合).ppt_第2页
高级软件工程(包含与聚合).ppt_第3页
高级软件工程(包含与聚合).ppt_第4页
高级软件工程(包含与聚合).ppt_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、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)

2、对象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,

3、包含的复用性建立在客户/服务器模式上 聚合的复用性需要内部构件提供支持 复用方式的选择: 当内部构件提供的接口完全满足要求时 使用聚合合适 当内部构件提供的接口与需求类似时 使用包含合适 在一个对象中可以同时使用两种复用方式,包含与聚合,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的定义为: c

4、lass CB: public IX, public IY protected: ULONG m_ref; public: CB(); CB(); / IUnknown virtual 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,

5、null, CLSCTX_INPROC_SERVER, IID_ISomeInterface,(void *) ,包含与聚合,11,包含的主要用途:扩展接口 假定想把一个 Iairplane接口扩展为 IFloatPlane: 定义:interface Iairplane: Iunknown void Takeoff(); void fly(); void Land(); interface IFloatPlane: Iairplane void Float(); void Sink(); void Rust(); void DrainBankAccount(); ,包含与聚合,12,(3)聚

6、合的实现,对象B的定义为: class CB: public IY protected: ULONG m_ref; public: CB(); CB(); / IUnknown virtual HRESULT _stdcall QueryInterface(const IID ,包含与聚合,13,HRESULT _stdcall CB:QueryInterface(const IID ,包含与聚合,14,问题:,QueryInterface,AddRef,Release,Fy,QueryInterface,AddRef,Release,Fx,IY,IX,内部构件的 IUnknown实现,外部构

7、件的 IUnknown实现,内部构件,外部构件,包含与聚合,15,解决方法:将内部构件的IUnknown接口进行隐藏 使内部构件的接口 调用外部接口的IUnknown接口 这样,内部构件将实现两个IUnknown接口 一个是“非代理未知接口” 按一般方式实现IUnknown接口 一个是“代理未知接口” 如果内部构件未被聚合 则代理未知接口将调用 转发给非代理未知接口 如果内部构件被聚合 代理未知接口将调用 转发给外部构件实现的未知接口,包含与聚合,16,CoCreateInstance与 IClassFactory中的pIUnknownOuter: HRESULT_stdcall CoCrea

8、teInstance( 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 函数 内部构件类厂的CreateInsta

9、nce 内部构件的构造函数 外部构件的 Init 函数: HRESULT _stdcall CB:Init() IUnknown * pUnknownOuter = this; HRESULT hr = CoCreateInstance(CLSID_ComponentA, pIUnknownOuter, CLSCTX_INPROC_SERVER, IID_IUnknown, (void * ) ,包含与聚合,20,内部构件类厂的CreateInstance: HRESULT _stdcall Cfactory:CreateInstance( IUnknown * pUnknownOuter, const IID ,包含与聚合,21,内部构件的构造函数:,CB:CB(IUnknown * pUnknownOuter):m_cRef(1) :InterlockedIncrement( ,包含与聚合,22,对外部构件Init的补充 HRESULT _stdcall CB:Init() I

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论