高级软件工程(包含与聚合)

高级软件工程(包含与聚合)

ID:38317786

大小:270.32 KB

页数:22页

时间:2019-06-09

高级软件工程(包含与聚合)_第1页
高级软件工程(包含与聚合)_第2页
高级软件工程(包含与聚合)_第3页
高级软件工程(包含与聚合)_第4页
高级软件工程(包含与聚合)_第5页
资源描述:

《高级软件工程(包含与聚合)》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、4、包含与聚合如果一个构件B使用另外一个构件A我们称使用者B为:外部构件被使用者A为:内部构件则:外部构件B包含(聚合)内部构件A包含与聚合是COM的两种复用方式(模型)为系统升级、扩展提供支持包含与聚合1(1)包含与聚合简介(2)包含的实现(3)聚合的实现(4)例子包含与聚合2(1)包含与聚合简介包含(Containment)对象A对象BIYIXIX’包含与聚合3对象B的成员函数在调用对象A的接口之前或之后可以进行其他一些操作IX’提供的功能可以超过IX对象B是对象A的客户而对象B的客户看到的只是对象B显露出的接口(IY、IX’)对象A的创建与释放完全在对象B内部进行对象A的生

2、命期包含在对象B的生命期内包含与聚合4对象A对象B聚合(Aggregation)IYIX包含与聚合5可以将聚合看作是包含的一个特例更好地体现了复用虽然对象A直接向对象B的客户提供服务但对象B的客户感觉不到对象A的存在对象A的生存期受到对象B的控制实现聚合的关键在于QueryInterface:当客户向对象B请求IX时对象B的QueryInterface返回对象A的IX指针存在问题:(1)从IX如何得到IY?(2)从IX得到的Iunknown如何与从IY得到的IUnknown相同?包含与聚合6包含的复用性建立在客户/服务器模式上聚合的复用性需要内部构件提供支持复用方式的选择:当内部

3、构件提供的接口完全满足要求时使用聚合合适当内部构件提供的接口与需求类似时使用包含合适在一个对象中可以同时使用两种复用方式包含与聚合7(2)包含的实现假定IX、IY的定义分别为:classIX:publicIUnknown{public:virtualHRESULT_stdcallFX()=0;}classIY:publicIUnknown{public:virtualHRESULT_stdcallFY()=0;}包含与聚合8对象B的定义为:classCB:publicIX,publicIY{protected:ULONGm__ref;public:CB();~CB();//IUn

4、knownvirtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv);virtualULONG__stdcallAddRef();virtualULONG__stdcallRelease();//IXHRESULT_stdcallFX();//IYHRESULT_stdcallFY();HRESULTInit();private:IX*m_pIX;}包含与聚合9类B的实现:CB::CB(){m_pIX=null;m_Ref=0;}CB::~CB(){if(m_pIX!=null)m_pIX->Release();}H

5、RESULTCB::Init(){HRESULTresult=::CoCreateInstance(CLSID_ComponentA,null,CLSCTX_INPROC_SERVER,IID_ISomeInterface,(void**)&m_pIX);if(FAILED(result))returnE_FAIL;elsereturnS_OK;}HRESULT_stdcallCB::IX(){returnm_pIX->FX();}包含与聚合10包含的主要用途:扩展接口假定想把一个Iairplane接口扩展为IFloatPlane:定义:interfaceIairplane:Iu

6、nknown{voidTakeoff();voidfly();voidLand();}interfaceIFloatPlane:Iairplane{voidFloat();voidSink();voidRust();voidDrainBankAccount();}包含与聚合11(3)聚合的实现对象B的定义为:classCB:publicIY{protected:ULONGm__ref;public:CB();~CB();//IUnknownvirtualHRESULT__stdcallQueryInterface(constIID&iid,void**ppv);virtualUL

7、ONG__stdcallAddRef();virtualULONG__stdcallRelease();//IYHRESULT_stdcallFY();HRESULTInit();private:IUnknown*m_pUnknownInner;}包含与聚合12HRESULT__stdcallCB::QueryInterface(constIID&iid,void**ppv){if(iid==IID_IUnknown){*ppv=static_cast(this);}e

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。