COM学习笔记6_COM的复用:包容和聚合

来源:互联网 发布:php财务管理 源码 编辑:程序博客网 时间:2024/05/03 04:18

继承可分实现继承和接口继承
接口继承 :一个类只能继承另一个接口。一个接口是里面只有纯虚函数,没有数据和函数实现
实现继承 :一个类继承另一个类,包括基类中的各种数据和实现

COM不支持实现继承,因为实现继承会造成较大耦合,违背了COM的思想。

COM实现复用可采用包容和聚合

--------------------------------------------------------------------------------------------------------
包容类似于设计模式中的代理模式,外部组件将接口调用转发给内部组件
例如组件CB(内部组件)实现了IY接口,组件CA(外部组件)要复用组件CB的IY接口


--------------------------------------------------------------------------------------------------------
聚合则直接把内部组件的接口指针返回给客户
相对来说包容的实现比较简单,而聚合复杂在于它不能仅仅简单的把内部组件的接口指针返回给客户,
这是由于QueryInterface有一定的规则,仅仅简单暴露内部组件的接口指针会违背这些规则。
所以内部组件必须有一个标志,判断自己是否被聚合,在不同情况下采取不同的方式处理QueryInterface,AddRef和Release接口。
这个标志就是维护一个指针,当他为空时,表示自己没有被聚合,否则,则自己被聚合,这个指针指向对应外部组件。
在CoCreateInstance和IClassFactory::CreateInstance原型中都有一个IUnknown *pUnkOuter参数,它就是用来初始化这个指针标志的。

原创粉丝点击