愚以为这是对象复用的两种技术。包容就是A对象内蕴涵B对象,并且B对象所提供的服务通过A对象暴露给外界;聚合就是A对象知道有一个B对象,而且知道B对象所能提供的服务,当有客户向它发出请求时,他就让B对象去处理客户的请求,与包容不同的是,此时A、B两个对象是并列存在的,不存在蕴涵关系。具体的实现原理你可以参考潘爱民的《COM原理与应用》。

解决方案 »

  1.   

    我明白包容了。
    例如有对象A,A有N个子
    那么
    A.Childs可以作为
    IChilds返回。
    IChilds.length
    IChilds.item(i)把A的服务给外界用。。
    这是包容了。。?
    那么聚合呢?
      

  2.   

    首先得明白,无论聚合还是包容,都是在二进制文件(dll,exe)
    的基础上建立起来。
    所谓包容,就是包容组件创建了被包容的对象的一个实例,然后包容
    对象夜实现了被包容对象的接口,只不过每当包容对象的接口被调用
    的时候,包容对象将调用转发给被包容对象。
      而聚合则是两个并列对象。当客户创建接口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);
               }
            } 
       }
      

  3.   

    C++的类,需要继承体系
    COM得接口,有时也需要从一个老的接口中,继承出一个新的接口
    但是,没有编译器的支持,所以采用了包容,聚合等这些方式