COM不支持实现继承的原因在于这种继承方式将使得一个对象的实现同另外一个对象的实现紧紧地关联起来。在这种情况下,当基类的实现被修改后,派生类将无法正常运行而必须被修改。这就是为什么一些用C++编写大型程序的专家们强烈建议人们基于抽象类来构建应用程序。

因此,为了保证以组件的修改不会影响应用程序的正常运行,COM并不支持实现继承。我们可以用组件包容来完全模拟实现继承。

包容和聚合

  对一个组件加以扩展或改造以使符合自己的使用需要,并可能会希望用此改造后的组件来代替原有的组件。

在C++中,对类的改造是用包容和继承来实现的。在COM中,则可使用包容和聚合来对组件进行改造。

包容和聚合实际上是使用一个组件实现别外一个组件的一种技术。在包容的情况下,外部组件将包含内部组件,而在聚合的情况下,则称外部组件聚合内部组件。

包容的简介

包容是在接口级别完成的。外部组件包含指向内部组件接口的指针。此时外部组件只是内部组件的一个客户,它将使用内部组件的接口来实现它自己的接口,见图8-1

外部组件也可以通过将调用转发给内部组件的方法重新实现内部组件所支持的某个接口。并且外部组件还可以在内部组件代码的前后加一些代码以对接口进行改造,见图8-2

包容的实现

在下面给出的例子中,组件1是一个实现了两个接口IX和IY的外部组件,但它复用了组件2(组件1所包容的一个内部组件,对IY的实现,这一点同图8-2所示完全是相同的)

包容例子(环境vs2008)

代码下载

聚合简介

聚合是包容的一个特例。外部组件将直接把内部组件的接口指针返回给客户。使用此种方法,外部组件将无需重新实现并转发接口中的所有函数。见图8-3。但这样外部组件无法对接口中的函数进行任何改造。当外部组件将内部组件的接口指针返回给客户之后,客户就可以直接同内部组件打交道了。(但是客户不应该知道它是在同两个不同的组件交互,否则将无法满足封装的要求。)

聚合的实现

假定客户向外部组件请求接口IY。此时外部组件可以不实现IY接口,而只需将内部组件请求查询此IY接口。指针返回给客户。客户可以直接使用此指针来调用内部组件所实现的那些IY成员。此时就IY接口而言,外部组件相当于是被架空了;它放弃了对IY接口的控制,而将此控制交给了内部组件。

聚合例子(环境vs2008)

代码下载

本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/08/29/1811901.html

COM笔记-包容与聚合的更多相关文章

  1. Mongodb Manual阅读笔记:CH6 聚合

    6 聚合 Mongodb Manual阅读笔记:CH2 Mongodb CRUD 操作Mongodb Manual阅读笔记:CH3 数据模型(Data Models)Mongodb Manual阅读笔 ...

  2. Dubbo -- 系统学习 笔记 -- 示例 -- 分组聚合

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 分组聚合 按组合并返回结果,比如菜单服务,接口一样,但有多种实现,用group区分 ...

  3. Caliburn.Micro学习笔记(三)----事件聚合IEventAggregator和 Ihandle<T>

    Caliburn.Micro学习笔记目录 今天 说一下Caliburn.Micro的IEventAggregator和IHandle<T>分成两篇去讲这一篇写一个简单的例子 看一它的的实现 ...

  4. Mongodb学习笔记四(Mongodb聚合函数)

    第四章 Mongodb聚合函数 插入 测试数据 ;j<;j++){ for(var i=1;i<3;i++){ var person={ Name:"jack"+i, ...

  5. MongoDB学习笔记五:聚合

    『count』count是最简单的聚合工具,返回集合中的文档数量:> db.foo.count()0> db.foo.insert({"x" : 1})> db. ...

  6. Java-马士兵设计模式学习笔记-代理模式-聚合与继承方式比较

    一.概述 1.目标:要在Tank的move()方法做时间代理及日志代理(可以设想以后还要增加很多代理处理),且代理间的顺序可活更换 2.思路: (1)聚合:代理类聚合了被代理类,且代理类及被代理类都实 ...

  7. 笔记:Maven 聚合和继承

    聚合模块 我们希望一次构建两个或更多项目,而不是到每个模块的目录下分别执行mvn命令,Maven 聚合这一特性就是为该需求服务的, 为了使用聚合,我们必须创建一个聚合模块,通过该模块与其他项目聚合,并 ...

  8. maven 学习笔记--仓库,聚合和继承,私服搭建

    仓库 http://blog.csdn.net/wanghantong/article/details/36427433 聚合和继承 http://www.cnblogs.com/xdp-gacl/p ...

  9. MongoDB 学习笔记之 group聚合

    group聚合: key: 分组字段 cond:过滤条件 reduce: curr是当前行 result是每组的结果集 initial : 组变量初始值 finalize: 统计一组后的回调函数 用g ...

随机推荐

  1. ASP.NET 检测当前计算机及登录用户名

    TextBox1.Text = System.Security.Principal.WindowsIdentity.GetCurrent().Name;

  2. java03类与对象相关问题

    1.使用类的静态字段和构造函数,可以跟踪某个类所创建对象的个数.请写一个类,在任何时候都可以向他查询"你已经创建了几个对象" 1 package 第四五周; 2 3 public ...

  3. 一个很多人不知道的SpringBoot小技能!!

    大家好,我是冰河~~ 最近,发现很多小伙伴在修改了SpringBoot的配置文件后,都要重新编译整个项目,极大的浪费了开发时间.我身边就有很多小伙伴一直是这样做的.那么,有没有什么方式能够修改配置文件 ...

  4. linux下nginx访问ftp目录权限问题

    在将nginx目录设置为ftp目录访问时会报错:403 forbidden 原因在于nginx访问时账户问题,通过修改nginx.conf中的访问名解决 打开nginx.conf 修改user值,去掉 ...

  5. Unittest方法 -- 测试分离

    一.下面是it.py 脚本,把浏览器前置和后置条件分离了"""套件公用测试类可进行分离"""import unittestfrom sele ...

  6. 10、Java——内部类

    ​  1.类中定义类 (1)当一类中的成员,作为另外一种事物的时候,这个成员就可以定义为内部类. (2)分类:①成员内部类 ②静态内部类 ③私有内部类 ④局部内部类 ⑤匿名内部类 ⑥Lambda表达式 ...

  7. 电子物流中的EDI 应用

    电子物流中的EDI 应用 背景 EDI 全称是Electronic data interchange, 即电子数据交换.在传统企业里,很多流程上的操作或者通信一般是由纸质媒介完成的,比如说采购订单.发 ...

  8. PAT乙级:1094 谷歌的招聘 (20分)

    PAT乙级:1094 谷歌的招聘 (20分) 题干 2004 年 7 月,谷歌在硅谷的 101 号公路边竖立了一块巨大的广告牌(如下图)用于招聘.内容超级简单,就是一个以 .com 结尾的网址,而前面 ...

  9. Linux 查看内存命令

    Linux 查看内存命令 top命令, Linux的top命令提供Linux资源使用情况的实时更新信息.不仅可以查看Linux内存,也可以查看CPU以及各个进程之间的对资源的占用情况.使用方式如下: ...

  10. Treestar Flowjo 10.6.2 for win64安装破解教程

    Treestar FlowJo v10.6.2是一款极其优秀好用的流式细胞数据分析工具,通过图像分析细胞的各种变化,利用软件自带的分析功能,结合细胞模型创建合理的数据分析平台.本教程提供其安装包.注册 ...