《高级软件工程(包含与聚合).ppt》由会员分享,可在线阅读,更多相关《高级软件工程(包含与聚合).ppt(22页珍藏版)》请在三一办公上搜索。
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)对象A的创建与释放完全
2、在对象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的定义为:class CB:public IX,public IY protected:
4、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,包含的主
5、要用途:扩展接口 假定想把一个 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();/IUnknownv
6、irtual 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接口这样,内部构件将实现两
7、个IUnknown接口一个是“非代理未知接口”按一般方式实现IUnknown接口一个是“代理未知接口”如果内部构件未被聚合则代理未知接口将调用转发给非代理未知接口如果内部构件被聚合代理未知接口将调用转发给外部构件实现的未知接口,包含与聚合,16,CoCreateInstance与IClassFactory中的pIUnknownOuter:HRESULT_stdcall CoCreateInstance(const CLSID,包含与聚合,17,QueryInterface,AddRef,Release,Fx,IX,代理Iunknown实现,非聚合构件,非代理Iunknown实现,包含与聚合,1
8、8,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_Co
9、mponentA,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()IUnknown*pUnknownOuter=this;HRESULT hr=CoCreateInstance(CLSID_ComponentA,pIUnknownOuter,CLSCTX_INPROC_SERVER,IID_IUnknown,(void*),包含与聚合,
链接地址:https://www.31ppt.com/p-6069847.html