天天看點

《C++面向對象高效程式設計(第2版)》——2.27 關聯

本節書摘來自異步社群出版社《c++面向對象高效程式設計(第2版)》一書中的第2章,第2.27節,作者: 【美】kayshav dattatri,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

c++面向對象高效程式設計(第2版)

關聯表示對象與不同類之間的結構關系(structual relationship),大多數關聯都是二進制關系(binary relation)。類之間的多重關聯(multiple association)和類本身的自關聯(self association)都是合法的(見圖2-19)。

關聯可以有一個名稱,表明閱讀方向的箭頭為可選。注意,方向箭頭為可選,但關聯名必須顯示。關聯在不同的方向可以有不同的名稱,但是,大多數情況下,沒必要注明(特别是在已标出角色名(role name)的情況下)。

“為其工作”是從person到company的關聯名,“雇傭”是從company到person的關聯名,箭頭指明關聯的方向。如此詳細的命名并不常見。

《C++面向對象高效程式設計(第2版)》——2.27 關聯

圖2-19

每個關聯的末端就是角色。每個角色都有一個名稱,說明其他的類如何看待這個類。company将person看做成“雇員”。類似地,person将company看成“雇主”。角色名必須唯一,它比關聯名更重要。

每個角色都說明了類的多重性(multiplicity)。例如,person可以為許多公司工作(即人與許多公司相關聯)。這說明角色的多重性(有多少個company類對象可以與一個person類對象相關聯?)。符号表明“許多”(對象的無限數目,其表示為0..)。一個person可以為許多company工作,一個company可以雇傭許多person。是以,company對于person的多重性就是1..*(許多)。多重性也可以是一個數字(1或5等等),或者是一個範圍(1..5)。

關聯末端的箭頭表明關聯的導航性。例如,如果可以找到(周遊)person所擁有的所有drivinglicense(駕駛執照)類對象清單,可以表示為圖2-20。

person可以擁有許多駕駛執照(不同國家、不同類别等),但是drivinglicense一定隻屬于一個person。

一個類還可以與本身形成關聯,即成為關聯類(association class)。在下面的示例中(見圖2-21),atmtransaction有自己的屬性和操作。關聯類也可以與自身形成關聯。在關聯線用虛線引出的類,即是關聯類。

在該例中(見圖2-21),atm類包含諸如owner(誰操作atm,通常是銀行)、address(實體位置)等的細節資訊。

當然,person在company中所占據的job本身也是一個類(見圖2-22)。

關聯類可能隻包含關聯的屬性,而無任何操作。在這種情況下,關聯類的名稱可以不顯示。

《C++面向對象高效程式設計(第2版)》——2.27 關聯

圖2-21

在許多情況下,我們更傾向于顯示整體-部分關系。聚集1(aggregation)是一種特殊形式的關聯。這種情況下,部分(即整體所包含的部分)的生存期不再取決于整體的生存期(見圖2-24)。

通過一個空菱形連接配接的類為聚集。不能線上的兩端都繪制菱形(見圖2-23)。當類之間沒有生存期依賴時,該表示法用于表示常見的按引用聚集。orchestra(管弦樂隊)是performer(演奏者)的全體演出者。如果将表示聚集的空菱形填充,則表示組合(composition)——聚集的一種加強的形式。稍候将讨論這個問題。

《C++面向對象高效程式設計(第2版)》——2.27 關聯

圖2-23

2.27.2 or 關聯

在某些情況下,一個類可以參與兩個關聯,但是每個對象一次隻能參與一個關聯。bankaccount可以由一人或多人所持有(共同賬戶(joint account)),或由company(公司)持有。這種情況可以用限制條件{or}表示。是以,person的多重性是*,而company的多重性就是1。automobile(汽車)也可作為類似的例子,company或person都可以擁有automobile。

繼續閱讀