在聚合中,客户永远只知道有外组件的存在,也永远只与外组件打交道,即使客户可以得到内组件的接口。
外组件聚合内组件时,在内组件中有代理和非代理。
1.为什么要在内组件中引入INondelegatingUnknown?
内组件和外组件都有一个IUnknown接口。
如果不聚合,那么:客户通过外组件接口查询IUnknown接口时,会得到一个地址A;
为了保证客户每次查询IUnknown接口时,都会得到地址A,
所以,必须在内组件中引入和IUnknown有相同作用的非代理接口INondelegatingUnknown,
这样,内组件中就有了两个接口:IUnknown和INondelegatingUnknown。
IUnknown中有:QueryInterface、AddRef、Release,它们就是代理。
INondelegatingUnknown中有:
NondelegatingQueryInterf
IUnknown中的QueryInterface中会调用m_pUnknownOuter->QueryInface(iid, ppv),作用是把查询转给外组件,这样客户查询接口时,都会调用外组件的QueryInterface。
INondelegatingUnknown中的NondelegatingQueryInterf
2.什么时候使用代理?
客户通过内组件接口QueryInterface查询内组件的接口时才使用代理。
3.什么时候使用非代理?
客户通过外组件接口QueryInterface查询内组件的接口时才使用非代理。