COM技术内幕学习笔记---第八章---组件复用:包容和聚合

翻译 2014年04月08日 15:06:46
COM 不支持实现继承的原因在于这种继承方式将 使得一个对象的实现同另外一个对象的实现紧紧地关联起来。

在这种情况下,当基类的实现被修改之后,派生类将无法正常运行而必须被修改。对于一个中等规模的C++程序而言,这或许并不成为一个问题,因在这种情况下,我们一般能够获取所有的源代码,因此也将能够对派生类进行修改。但是对于较大的C++程序而言,对受影响的派生类进行修改所花费的时间将是相当长的。更糟的是,我们可能根本无法得到所有的源代码。这就是为什么一些用C++编写大型程序的专家们强烈建议人们基于抽象基类来构建应用程序。

抽象基类是一种最纯粹的接口继承,并且正好也被用来实现COM接口。由于任何人可以用任何语言在任何地方编写COM组件,因此必须有一种非常严格的方法来保证组件的客户不会因组件的变化而受到影响。显然实现继承无法提供客户所需的保护。

因此,为了保证对组件的修改不会影响应用程序的正常运行,COM并不支持实现继承。但这并不会使COM的功能有任何损失,因我们可以用组件包容来完全模拟实现继承。
在C++中,对类的改造是用包容和继承来实现的。在COM中,则可使用内容和聚合来对组件进行改造。包容和聚合实际上是使一个组件使用另外一个组件的一种技术。

聚合的目标就是使客户确信内部组件所实现的某个接口是由外部组件实现的。此时需要从内部组件中将一个指针直接传给客户并使客户相信此接口指针是属于外部组件的。若将内部组件按通常方式实现的接口指针传给客户,那么客户得到的是对于组件的一个分裂的视图。也就是说内部组件的接口将调用内部组件所实现的QueryInterface,而外部组件则有其自己的QueryInterface。当客户查询属于内部组件的接口时,它所获得的关于组件的功能试图与它查询外部组件的接口时是不同的。

用一个例子来说明这个问题可能会更加清楚。假定有某个聚合组件。其中外部组件支持接口IX和IY。它自己实现了IX接口,而IY接口是聚合得到的。内部组件实现了IY和IZ接口。在创建了外部组件之后,我们将可以看到起IUnknown接口指针。用此接口指针可以成功地查询IX或IY,但查询IZ时将返回E_NOINTERFACE。当查询IY接口时,得到的实际上是内部组件的IY接口指针。若使用此IY指针查询IZ,此查询将会成功。这是由于IY接口的IUnknown函数时内部组件实现的。与此类似,通过IY接口查询IX将会失败,这是由于内部组件并不支持IX。这样一来,关于QueryInterface实现的一条基本规则,即“若能够从某接口获取某特定接口,则从任意接口都将能够获取此接口”。


内部组件使用外部未知接口最简单的方法是将调用请求转发给外部未知接口。为此,内部组件需要一个指向外部未知接口的指针。并且它还需要知道它是被聚合的。


组件的复用同将一个组件包容在另外一个组件中是一样简单的。当需要对组件进行定制时,可以在调用其成员函数的前后加上自己的代码。

如果只是希望给组件增加新的接口,那么可以使用聚合的方法。在作者看来,聚合实际上是包容的一个特例。当外部组件聚合内部组件的某个接口时,外部组件可以将接口指针直接传给客户,而不需要重新实现此接口或转发相应的函数调用。


但并不是所有组件都是可以被聚合的。为此需要对组件的实现稍稍加以修改。此时内部组件需要两个不同的未知接口。其中一个未知接口要实现IUnknown接口的成员函数,而另外一个未知接口则可以在组件未被聚合的情况下将有关的函数调用转发给非代理未知接口;而在其被聚合的情况下则将其转发给外部组件的IUnknown接口。

com技术内幕--读书笔记(8_1)

第8章 “实现继承”,指的是继承基类代码或实现,“接口继承”,指的是继承基类类型或接口。 COM支持的继承是接口继承,不支持实现继承。实现继承会导致一个对象的实现同另外一个对象实现关联起来,...
  • simeone18
  • simeone18
  • 2012年02月05日 23:09
  • 1557

包容和聚合(COM技术内幕笔记五)

包容和聚合:   包容和聚合实际上是使一个组件使用另外一个组件的一种技术。在包容的情况下,外部组件将包含内部组件。在聚合的情况下,外部组件聚合内部组件。   在此设想一下,外部组件是我们的要实现的组件...
  • wilsonany
  • wilsonany
  • 2010年09月13日 20:53
  • 214

COM原理与实现之二: 聚合

COM原理与实现之二: 聚合C++没有同聚合等价的特性。聚合实际上是继承性的一种动态形式。而C++的继承总是静态的,是实现继承。COM是接口继承,通过聚合接口,可以做成动态配置。研究COM,主要是利用...
  • cheungmine
  • cheungmine
  • 2016年06月14日 00:05
  • 5948

COM 技术内幕学习之八(包容和聚合)

一、实现继承1、COM支持的是接口继承,它继承的是抽象基类的接口COM为什么不用实现继承?(基类组件的改动引起派生类组件的改动)2、一般的继承是派生类继承基类的实现3、用组件包容来模拟实现继承在C++...
  • InsideKernel
  • InsideKernel
  • 2008年03月11日 15:25
  • 1277

打造 Vue.js 可复用组件

Vue.js 是一套构建用户界面的渐进式框架。我们可以使用简单的 API 来实现响应式的数据绑定和组合的视图组件。 从维护视图到维护数据,Vue.js 让我们快速地开发应用。但随着业务代...
  • wulixiaoxiao1
  • wulixiaoxiao1
  • 2017年03月20日 09:59
  • 4949

COM组件停止响应简单分析,还没有答案?

    今天这边的系统又停止响应了,图形不能浏览。远程怎么折腾也没有找出原因来,后来没办法了,两位同事去了趟机房,发现有一台服务器上perl.exe起了数十个,完全堵死了。后来手工杀进程虽然把这些p...
  • complayer
  • complayer
  • 2007年12月14日 09:45
  • 1247

COM技术内幕学习笔记---第八章---组件复用:包容和聚合

COM 不支持实现继承的原因在于这种继承方式将 使得一个对象的实现同另外一个对象的实现紧紧地关联起来。 在这种情况下,当基类的实现被修改之后,派生类将无法正常运行而必须被修改。对于一个中等规模的C+...
  • shb8845369
  • shb8845369
  • 2014年04月08日 15:06
  • 1330

COM原理之包容与聚合

1.包容和聚合的概念包容和聚合实际上是使一个组件使用另外一个组件的一种技术。包容的情况下,客户只能看到外部组件的接口,而外部组件接口的实现是通过转发给内部组件实现的。聚合的情况下,直接将内部组件的借口...
  • xsh_123321
  • xsh_123321
  • 2010年09月08日 11:36
  • 2162

COM---组件复用:包容与聚合

包容和 聚合为实现组件复用和定制提供了一种极鲁棒性的机制。使得COM框架下不需要实现继承,客户通组件的实现完全隔离开。 如果希望给组件增加新的接口,可以使用聚合。聚合是包容的一个特例。以下代码只列出...
  • u012319493
  • u012319493
  • 2017年02月16日 19:05
  • 454

用MFC写的COM如何实现包容或聚合?

实现包容只需加一个接口指针的成员变量,然后在固定的地方初始化它(ATL中可以在FinalConstructor()(可能记错)中初始化接口指针,即调用CoCreateInstance),但是在MFC中...
  • medvision
  • medvision
  • 2007年04月17日 12:04
  • 965
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:COM技术内幕学习笔记---第八章---组件复用:包容和聚合
举报原因:
原因补充:

(最多只允许输入30个字)