2017-01-10 44 views
1

我对COM聚集的一些理论问题:COM聚合 - 删除外部组件,但保留内部

  1. 是否可以删除外部组件,但保留了内部组件? (我想不是,但我不是100%确定的。)

  2. 内部元件是否有可能由两个不同的外部元件(直接)聚合?

  3. 如果对另外两个问题的答案是否定的,那么它是正确的,'COM聚合'相当于UML组合而不是聚合?

回答

1

要回答1,没有。当内部对象的IUnknown::QueryInterface对于非IIP的非成功运行成功时,内部对象将增加外部对象的引用计数。实质上,如果内部对象是活着的,即使没有外部实体持有对外部对象的引用,外部对象也是活动的。这一定是如此,因为任何QueryInterface,AddRefRelease对内部对象的非IUnknown执行接口指针必须委托给外部对象。

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

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

2

当您创建聚合COM对象时,您在实例化时提供了一个外部接口,并且以后无法再进行更改。这对于前两个问题最终是“否定的”。