COM 聚合 - 删除外部组件但保留内部组件
COM Aggregation - Delete Outer Component but retain Inner
我有一些关于 COM 聚合的理论问题:
是否可以删除外部组件而保留内部组件? (我想不是,但我不是 100% 确定。)
是否有可能一个Inner Component由两个不同的Outer Components聚合(直接)?
如果其他两个问题的答案是否定的,那么 'COM aggregation' 在 UML 术语中更像是组合而不是聚合是否正确?
创建聚合 COM 对象时,您在实例化时提供了一个外部接口,以后无法更改。这最终是前两个问题的"no"。
回答 1,没有。当它的 IUnknown::QueryInterface
为非 IUnknown
IID 成功运行时,内部对象会增加外部对象的引用计数。本质上,如果内部对象是活的,那么外部对象也是活的,即使没有外部实体持有对外部对象的引用。必须如此,因为在内部对象的非 IUnknown
接口指针上执行的任何 QueryInterface
、AddRef
和 Release
必须委托给外部对象。
回答 2,没有。内部对象无法知道它是从哪个对象调用的,即使有,也会破坏身份。例如,在 COM 中,唯一可靠的对象身份检查是两个 IUnknown
接口指针是否相同,但每个人都假设如果任何两个,可能是非 IUnknown
,接口指针相同,它们来自同一个对象(不能保证反过来,两个非 IUnknown
接口指针,即使是相同类型,也可能不同并指向同一个对象)。
回答 3,COM 聚合是组合的一种特殊情况,我们 return 直接从内部对象中获取接口指针,而不是使用重定向或包装方法实现拦截的接口。当您有许多组合对象时,此优化更为相关。它不应该是第一种组合方法,因为你会失去控制并且有一些限制,例如您不能包装提供给内部对象或由内部对象 return 编辑的对象,没有预处理和 post 处理,外部对象和内部对象不应在功能上重叠(例如,如果外部对象根据父对象的某些定义有一个父对象,内部对象在同一定义下不应该有不同的父对象,或者它应该完全不知道这样的父对象;子对象也一样),等等
我有一些关于 COM 聚合的理论问题:
是否可以删除外部组件而保留内部组件? (我想不是,但我不是 100% 确定。)
是否有可能一个Inner Component由两个不同的Outer Components聚合(直接)?
如果其他两个问题的答案是否定的,那么 'COM aggregation' 在 UML 术语中更像是组合而不是聚合是否正确?
创建聚合 COM 对象时,您在实例化时提供了一个外部接口,以后无法更改。这最终是前两个问题的"no"。
回答 1,没有。当它的 IUnknown::QueryInterface
为非 IUnknown
IID 成功运行时,内部对象会增加外部对象的引用计数。本质上,如果内部对象是活的,那么外部对象也是活的,即使没有外部实体持有对外部对象的引用。必须如此,因为在内部对象的非 IUnknown
接口指针上执行的任何 QueryInterface
、AddRef
和 Release
必须委托给外部对象。
回答 2,没有。内部对象无法知道它是从哪个对象调用的,即使有,也会破坏身份。例如,在 COM 中,唯一可靠的对象身份检查是两个 IUnknown
接口指针是否相同,但每个人都假设如果任何两个,可能是非 IUnknown
,接口指针相同,它们来自同一个对象(不能保证反过来,两个非 IUnknown
接口指针,即使是相同类型,也可能不同并指向同一个对象)。
回答 3,COM 聚合是组合的一种特殊情况,我们 return 直接从内部对象中获取接口指针,而不是使用重定向或包装方法实现拦截的接口。当您有许多组合对象时,此优化更为相关。它不应该是第一种组合方法,因为你会失去控制并且有一些限制,例如您不能包装提供给内部对象或由内部对象 return 编辑的对象,没有预处理和 post 处理,外部对象和内部对象不应在功能上重叠(例如,如果外部对象根据父对象的某些定义有一个父对象,内部对象在同一定义下不应该有不同的父对象,或者它应该完全不知道这样的父对象;子对象也一样),等等