聚合实现的示意图

以前学《COM技术内幕》的时候,对聚合的一个总结:


代码如下:

外部组件创建后,接着创建内部组件

IUnkNown* pUnkNownOuter = this; // this的值为&CA

CoCreateInstance(CLSID_CB,

pUnkNownOuter,

CLSCTX_INPROC_SERVER,

IID_IUnkNown,

(void**)&m_pUnkNownInner);

m_pUnkNownInner为外部组件的成员

调用下面的函数

{

IClassFactory* pIFactory = NULL;

CoGetClassObject(CLSID_IB,

NULL,

IID_IClassFactory,

(void**)&pIFactory);

pIFactory->CreateInstace(pUnkNownOuter,iid,ppv);

}

CreateInstace(IUnkNown* pUnkNownOuter,const IID& iid,void** ppv)

{

//只能被IID_IUnkNown接口聚合

if ((pUnkNownOuter != NULL) && (iid != IID_IUnkNown))

{

return CLASS_E_NOAGGREGATION ;

}

CB* pB = new(pUnkNownOuter);

pB->NonQueryInterface(iid,ppv);

}

CB::NonQueryInterfacer(IID& iid,void** ppv)

{

if (iid = IID_IUnkNown)

*ppv = static_cast<INonUnkNown*>(this);

}

实际上CB的构造函数是这样的:

CB::CB(IUnkNown* pUnkNownOuter) : m_cRef(1)

{

::InterlockedIncrement(&g_cComponents) ;

if (pUnkNownOuter == NULL) //不使用聚合,转换成非委托接口

{

m_pUnkNownOuter = reinterpret_cast<IUnkNown*>

(static_cast<INondelegatingUnkNown*>

(this)) ;

}

else

{ //使用聚合 转换成外部接口

m_pUnkNownOuter = pUnkNownOuter ;

}

}

相关文章

迭代器模式(Iterator)迭代器模式(Iterator)[Cursor]意图...
高性能IO模型浅析服务器端编程经常需要构造高性能的IO模型,...
策略模式(Strategy)策略模式(Strategy)[Policy]意图:定...
访问者模式(Visitor)访问者模式(Visitor)意图:表示一个...
命令模式(Command)命令模式(Command)[Action/Transactio...
生成器模式(Builder)生成器模式(Builder)意图:将一个对...