COM聚合 - 删除外部组件但保留内部

时间:2017-01-10 01:36:39

标签: com aggregation

我有一些关于COM聚合的理论问题:

  1. 是否可以删除外部组件但保留内部组件? (我想不是,但我不是百分百肯定。)

  2. 内部组件是否可能由两个不同的外部组件(直接)聚合在一起?

  3. 如果对另外两个问题的答案是否定的,那么'COM聚合'是否比UML术语更适合聚合?

2 个答案:

答案 0 :(得分:2)

创建聚合COM对象时,您将在实例化时提供外部接口,并且以后无法更改。这最终是一个" no"前两个问题。

答案 1 :(得分:1)

回答1,没有。当内部对象的IUnknown::QueryInterface成功运行非IUnknown IID时,内部对象会增加外部对象的引用计数。本质上,如果内部对象是活动的,那么外部对象也是如此,即使没有外部实体持有对外部对象的引用。必须这样,因为在内部对象的非QueryInterface接口指针上执行的任何AddRefReleaseIUnknown必须委托给外部对象。

回答2,没有。内部对象无法知道从哪个对象调用它,即使存在,也会使身份中断。例如,在COM中唯一可靠的对象标识检查是两个IUnknown接口指针是否相同,但每个人都假设如果任何两个,可能是非IUnknown接口指针是相同的,它们来自同一个对象(不能保证相反的方式,两个非IUnknown接口指针,即使是相同类型,也可能不同并引用同一个对象。)

回答3,COM聚合是一个特殊的组合案例,它不是通过重定向或包装方法实现截获的接口,而是从内部对象返回直接接口指针。当您有许多组合对象时,此优化更相关。它不应该是第一种构图方法,因为你失去控制并且有一些限制,例如:你不能包装提供给内部对象或由内部对象返回的对象,没有预处理和后处理,外部对象和内部对象不应该在功能上重叠(例如,如果外部对象具有父对象,则根据某些定义parent,内部对象不应该在同一个定义下有不同的父对象,或者它应该完全不知道这样的父对象;对于子对象也是如此)等等。