類間關係
在類圖中,除了需要描述單獨的類的名稱、屬性和操作外,我們還需要描述類之間的聯絡,因為沒有類是單獨存在的,它們通常需要 和別的類協作,創造比單獨工作更大的語義。在uml類圖中,關係用類框之間的連線來表示,連線上和連線端頭處的不同修飾符表示不同的關係。類之間的關係有 繼承(泛化)、關聯、聚合和組合。
(1)繼承:指的是乙個類(稱為子類)繼承另外的乙個類(稱為基類)的功能,並增加它自己的新功能的能 力,繼承是類與類之間最常見的關係。類圖中繼承的表示方法是從子類拉出一條閉合的、單鍵頭(或三角形)的實線指向基類。例如,圖3.2給出了mfc中 cobject類和選單類cmenu的繼承關係。
圖3.2 類的繼承
類的繼承在c++中呈現為:
class b
class a : public b
(2) 關聯:指的是模型元素之間的一種語義聯絡,是類之間的一種很弱的聯絡。關聯可以有方向,可以是單向關聯,也可以是雙向關聯。可以給關聯加上關聯名來描述關 聯的作用。關聯兩端的類也可以以某種角色參與關聯,角色可以具有多重性,表示可以有多少個物件參與關聯。可以通過關聯類進一步描述關聯的屬性、操作以及其 他資訊。關聯類通過一條虛線與關聯連線。對於關聯可以加上一些約束,以加強關聯的含義。
關聯在c++中呈現為:
class a
class b
a::function1(b &b) //或a::function1(b b) //或a::function1(b *b)
即乙個類作為另乙個類方法的引數。
(3) 聚合:指的是整體與部分的關係。通常在定義乙個整體類後,再去分析這個整體類的組成結構。從而找出一些組成類,該整體類和組成類之間就形成了聚合關係。例 如乙個航母編隊包括海空母艦、驅護艦艇、艦載飛機及核動力攻擊潛艇等。需求描述中「包含」、「組成」、「分為…部分」等詞常意味著聚合關係。
(4)組合:也表示類之間整體和部分的關係,但是組合關係中部分和整體具有統一的生存期。一旦整體物件不存在,部分物件也將不存在。部分物件與整體物件之間具有共生死的關係。
聚 合和組合的區別在於:聚合關係是「has-a」關係,組合關係是「contains-a」關係;聚合關係表示整體與部分的關係比較弱,而組合比較強;聚合 關係中代表部分事物的物件與代表聚合事物的物件的生存期無關,一旦刪除了聚合物件不一定就刪除了代表部分事物的物件。組合中一旦刪除了組合物件,同時也就 刪除了代表部分事物的物件。
我們用淺顯的例子來說明聚合和組合的區別。「國破家亡」,國滅了,家自然也沒有了,「國」和「家」顯然也是組合 關係。而相反的,計算機和它的外設之間就是聚合關係,因為它們之間的關係相對鬆散,計算機沒了,外設還可以獨立存在,還可以接在別的計算機上。在聚合關係 中,部分可以獨立於聚合而存在,部分的所有權也可以由幾個聚合來共享,比如印表機就可以在辦公室內被廣大同事共用。
在c++語言中,從實現的角度講,聚合可以表示為:
class a
class b
即類b包含類a的指標;
而組合可表示為:
class a
class b
即類b包含類a的物件。
準確的uml類圖中用空心和實心菱形對聚合和組合進行了區分。
圖3.4 聚合和組合
聚合,關聯,組合 是物件之間的三種關係。從某種意義上說,繼承是一種類的縱向關係,而聚合,關聯,組合是物件的橫向關係。
其關係強弱為 關聯《聚合《組合
關 聯和聚合的區別主要在語義上,關聯的兩個物件之間一般是平等的,例如你是我的朋友,聚合則一般不是平等的,例如乙個公司包含了很多員工,其實現上是差不多 的。聚合和組合的區別則在語義和實現上都有差別,組合的兩個物件之間其生命期有很大的關聯,被組合的物件是在組合物件建立的同時或者建立之後建立,在組合 物件銷毀之前銷毀。一般來說被組合物件不能脫離組合物件獨立存在,而且也只能屬於乙個組合物件,例如乙個文件的版本,必須依賴於文件的存在,也只能屬於一 個文件。聚合則不一樣,被聚合的物件可以屬於多個聚合物件,例如乙個員工可能可以屬於多個公司。
我想舉個通俗的例子。
你和你的心臟之間是composition關係(心臟只屬於自己)
你和你買的書之間是aggregation關係(書可能是別人的)
你和你的朋友之間是association關係
聚合 組合 關聯的區別
記得在當時學習uml總是不好分清聚合與組合的關係,找工作時特地複習了這塊的內容,結果正巧被面試官問道,這兩天又在搞這塊的內容,對聚合與組合有了更清楚的了解 聚合 表示兩個物件之間是整體和部分的弱關係,部分的生命週期可以超越整體。如電腦和滑鼠,就可以用一下圖形表示 組合 表示兩個物件之間是整體和部分的...
依賴 關聯 聚合 組合 的區別
1.例項化 依賴 a將b作為區域性變數進行使用.程式1 void a foo 2.關聯 a與b存在一定的關係.這裡只考慮單向導航.關聯在 中有多種表現形式.第一種,作為引數 程式2 void a foo b b b b or b b 第二種,作為成員變數 程式3 class a void foo p...
關聯 聚合 組合
關聯 聚合 aggregation 以及組合 composition 的區別?涉及到uml中的一些概念 關聯是表示兩個類的一般性聯絡,比如 學生 和 老師 就是一種關聯關係 聚合表示 has a 的關係,是一種相對鬆散的關係,聚合類不需要對被聚合類負責,如下圖所示,用空的菱形表示聚合關係 從實現的角...