聚合实现的示意图

以前学《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 ;

}

}

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...