2014-02-23 68 views
38

我正在評論我在面向對象編程方面的知識。在類之間的關係主題下,我遇到了一些對我而言有點模糊的關係。聚合vs組合vs協會vs直接關聯

我知道依賴「使用a」和繼承「is-a」,但我對聚合,組合,關聯和直接關聯有點陌生;另外,他們中哪一個是「有一個」關係。有些使用Aggregation可與公會互換。

什麼是直接關聯?另外,什麼是組成?在UML圖中,表示它們的箭頭是不同的。如果你能爲我清除這些東西,我會非常感激。

+0

閱讀Paul Gestwicki的[this](http://www.cs.bsu.edu/homepages/pvg/misc/uml/)文章。 –

回答

89

請注意,對「關聯」定義有不同的解釋。我的觀點很大程度上取決於您在Oracle認證書和學習指南中閱讀的內容。

臨時關聯

的方法,它的簽名的內部或作爲返回值的使用。這不是真正的對特定對象的引用。

例如:我把車停在車庫裏。

Temporary Association UML

組成關聯

所謂「牢固的關係」:鏈接對象的實例化通常很難 所述對象的構造內部編碼。它不能從 以外的對象設置。 (組成不能是多對多 的關係。)

示例:房子由石頭組成。

Composition UML

直接關聯

這是一個 「弱關係」。對象可以獨立生活,通常有setter或其他方式來注入依賴對象。

示例:一輛車可以有乘客。

Direct Association UML

聚合關聯

非常相似,有直接聯繫。這也是具有獨立對象的「弱關係」。然而,這裏關聯的對象是包含對象的關鍵部分。

示例:汽車應該有輪胎。

Aggregation UML

注:兩者直接關聯和聚合協會常常概括爲 「關聯」。差異相當微妙。

6

直接關聯與其他三個沒有共同之處。它根本不屬於UML,它是IBM requirements modelling term

至於其他人,

協會A-> B是依賴的孩子。關聯意味着,A(或其實例)有一些簡單的方法可以到達B的實例。例如,a.x.y.b.或者通過函數,或者通過一些局部變量。或者通過直接引用或指針,或其他東西(世界上有很多種語言)。如你所見,依賴和關聯之間沒有嚴格的界限。

關聯的屬性之一是聚集,它可以具有值:無,共享(通常不正確地稱爲聚合)和組合。

如果A(或實例)具有B的一些(或一個)實例,那麼銷燬關聯意味着銷燬B實例,那就是組合。

如果您或工具作者已經決定,某些關係 - 組成較弱,需要特別顯示,則可以使用shared聚合。通常它是A中B的一些參考集合。

還有一些更有趣的關聯屬性。如果你有興趣,請看here

+0

請注意,在UML中,關聯的概念不是來源於依賴關係的概念。一個關聯是一種關係和一個分類器,而一個關聯則是一種關係。另外你的作文解釋是不正確的,請參閱我對[這個問題]的回答(http://stackoverflow.com/questions/21951602/difference-between-composition-and-dependency-in-class-diagram)。 –

+0

它不是作爲模型元素派生的。但是通過它們的定義,每一個關聯A→B也是依賴關係A-→B。一個是另一個的子集。謝謝,唉,我注意到,他們沒有這麼說。 – Gangnus

+0

沒有這種說法是純粹的錯誤。在這種情況下,每個協會都必須是定向關係,這是不正確的。 –

4

對象類型之間的關聯對這些類型的對象之間的關係進行分類。例如,協會Person-isEmployedBy-Enterprise可以對類型爲Person的對象PeterMiller,SusanSmith和SarahAnderson以及Google和IBM類型之間的關係進行分類PeterMiller-isEmployedBy-IBM,SusanSmith-isEmployedBy-IBM和SarahAnderson-isEmployedBy-Google Enterprise。換句話說,關聯是兩個或多個參與其中的對象類型的關係類型。兩種對象類型之間的關聯稱爲二進制。雖然二元關聯更常見,但我們也可能需要處理n元關聯,其中n是大於2的自然數。例如,Person -isTreatedIn-Hospital -for-Disease是3元(「三元」 )對象類型Person,HospitalDisease之間的關聯。

我想,「直接關聯」是指定向(或定向)關聯,它是一個關聯(具有域類和範圍類),表示其域類中的引用屬性。這種定向關聯在其目標端有一個「所有權點」。

更多關於關聯的信息,請參閱this book chapter

請參閱我對this SO question的回答以獲取聚合和合成的解釋。

10

例如 OOP的重點在於您的代碼可以複製真實世界的對象,從而使您的代碼具有可讀性和可維護性。

  1. 協會

協會基本上是一類使用B級作爲一個例子

  • 員工使用巴士/火車服務進行運輸。
  • Computer使用鍵盤作爲輸入裝置

並且在UML圖協會由正常箭頭表示。

  • 聚合 A類含有B類或A類具有類B. 的實例的聚合時使用對象的壽命是獨立的容器對象,但仍容器對象擁有聚合對象。
  • 因此,如果我們刪除A級並不意味着B類也將被刪除,作爲例子(非或許多教師可以屬於一個或多個部門)教師和部門之間的關係是聚集。

  • 組成 類A擁有類B. 作爲一個例子,主體由臂,頭部,腿部的,包括的BankAccount平衡和TransactionHistory的。 所以如果類被刪除,那麼類B也會被刪除。