愚以为这是对象复用的两种技术。包容就是A对象内蕴涵B对象,并且B对象所提供的服务通过A对象暴露给外界;聚合就是A对象知道有一个B对象,而且知道B对象所能提供的服务,当有客户向它发出请求时,他就让B对象去处理客户的请求,与包容不同的是,此时A、B两个对象是并列存在的,不存在蕴涵关系。具体的实现原理你可以参考潘爱民的《COM原理与应用》。
解决方案 »
- 针对某个硬件(比如短信机芯片)来写软件接口给外部程序调用,需要了解哪方面的内容?硬件有没有接口给外部程序读写的?
- 在IE插件里面如何监听到 浏览器打开一个新的网页或者网页被刷新?
- 急!在线等。请问为什么用WinExec、CreateProcess等都调不起来程序。但是在“开始”-手工就可以。
- 请问在xp下vc中如何对磁盘某个扇区读写?
- 高手救命:CDataSource,CSession,CCommand<CAccessor<my> >,CTable<CAccessor<my> > 数据集不能用insert,等问题(顺提供atl的数据库访问过
- IDC_EDIT1是关联到控件类型成员上好,还是连到string上好呢?
- 如何使编辑框(如Edit,RichEdit)中的内容自动换行?
- 怎样加入背景
- 关于透明位图
- 如何画一根可以选取,移动,放大,缩小的直线?
- 很多关于对话框内有个可以拉动的编辑框,里面写一些信息,是怎样弄成的
- 大家好 100 分 简单也复杂
例如有对象A,A有N个子
那么
A.Childs可以作为
IChilds返回。
IChilds.length
IChilds.item(i)把A的服务给外界用。。
这是包容了。。?
那么聚合呢?
的基础上建立起来。
所谓包容,就是包容组件创建了被包容的对象的一个实例,然后包容
对象夜实现了被包容对象的接口,只不过每当包容对象的接口被调用
的时候,包容对象将调用转发给被包容对象。
而聚合则是两个并列对象。当客户创建接口a时,如果a没有实现接口,
则a会创建接口b,将接口b暴露给客户。
用C++描述如下:
包容
class b
{
void functionA();
}
class A
{
b objB;
void functionA() //same interface
{
objB.functionA();
}
}
聚合
class B
{
void QueryInterface();
}
class A
{
void QueryInterface(IID iid,void *ppv)
{
if(A没有实现iid)
{
创建组件b
b.QueryInterface(iid,ppv);
}
}
}
COM得接口,有时也需要从一个老的接口中,继承出一个新的接口
但是,没有编译器的支持,所以采用了包容,聚合等这些方式