2017-01-10 57 views
1

我對COM聚集的一些理論問題:COM聚合 - 刪除外部組件,但保留內部

  1. 是否可以刪除外部組件,但保留了內部組件? (我想不是,但我不是100%確定的。)

  2. 內部元件是否有可能由兩個不同的外部元件(直接)聚合?

  3. 如果對另外兩個問題的答案是否定的,那麼它是正確的,'COM聚合'相當於UML組合而不是聚合?

回答

1

要回答1,沒有。當內部對象的IUnknown::QueryInterface對於非IIP的非成功運行成功時,內部對象將增加外部對象的引用計數。實質上,如果內部對象是活着的,即使沒有外部實體持有對外部對象的引用,外部對象也是活動的。這一定是如此,因爲任何QueryInterface,AddRefRelease對內部對象的非IUnknown執行接口指針必須委託給外部對象。

要回答2,沒有。內部對象無法知道它從哪個對象被調用,即使存在,也會導致標識中斷。例如,在COM中,唯一可靠的對象身份檢查是兩個接口指針是否相同,但每個人都假定如果任意兩個接口指針是相同的,它們來自同一個對象(不能保證其他方式,即使是相同類型的兩個非接口指針也可能不同,並指向同一個對象)。

要回答3,COM聚合是組合的一個特例,其中不是用重定向或包裝方法實現截取的接口,而是從內部對象返回直接接口指針。當你有很多組合的對象時,這種優化更加相關。它不應該是第一個構圖的方法,因爲你失去了控制並且有一些限制,例如,你不能包裝提供給內部對象或由內部對象返回的對象,也不能預處理和後處理,外部對象和內部對象不應該在功能上重疊(例如,如果外部對象根據某些定義父對象在同一個定義下不應該有不同的父對象,或者它應該完全不知道這樣的父對象;對於子對象也是如此)等等。

2

當您創建聚合COM對象時,您在實例化時提供了一個外部接口,並且以後無法再進行更改。這對於前兩個問題最終是「否定的」。