面向物件程式設計中類之間的關係
在面向物件的程式設計中,理清楚類和類之間的關係,畫出清晰的類圖,有助於能極大地提高程式開發的效率。
類和類之間的關係主要有繼承(inheritance)、實現(realization)、依賴(dependency)、關聯(association)、聚合(aggregation)和組合(composition)。下面用PlantUML畫各種關係的類圖,並分別介紹。
1、繼承(inheritance)和實現(realization)
繼承和實現可以放在一起來了解,區別就在於上層是父類還是一個介面。
在UML中,繼承用帶三角箭頭的實線表示,箭頭從子類指向父類;實現用帶三角箭頭的虛線表示,箭頭從實現類指向介面。如下:

繼承和實現
對應的PlantUML程式碼如下:
@startuml Title "繼承和實現" Car <|-- Ferrari note as N1 Ferrari類繼承Car類 end note InterI <|.. ClassC note as N2 類ClassC實現了InterI介面 end note @enduml
2、依賴關係(dependency)
依賴就是一個類A使用到了另一個類B,所以,有些英文的材料中將這種關係表述為引用(using)。這種關係具有偶然性、臨時性,也非常弱,但是,類B的變化會影響到類A。程式碼中,一般表現為,類A中的某個成員函式用到了某個類B型別的引數,或者類A中的某個成員函式,用到了類B型別的某個臨時變數,等等。
在UML中,依賴關係用帶箭頭的虛線表示,箭頭從使用類指向被依賴的類。如下:

依賴關係
@startuml Title "依賴" note as N1 Person類的eat方法中 用到了Food類, Person類依賴於Food類 end note class Person { + void eat(Food f); } Person ..> Food: using @enduml
3、關聯關係(Association)
關聯體現的是兩個類之間語義級別的一種強依賴關係,是一種物件之間的引用關係,比如商品類和訂單類。這種關係比依賴關係要密切很多,不偶然,也不臨時。一般地,程式實現中,類A中的某個屬性的型別是類B,我們稱類A和類B的關係是關聯關係,其中類A稱為關聯類,類B稱為被關聯類。關聯可以是單向、雙向的。
在UML中,關聯關係用由關聯類A指向被關聯類B的帶箭頭實線表示,在關聯的兩端可以標註關聯雙方的多重性標記。如下:

關聯關係
@startuml Title "關聯" note as N1 單個訂單可包含多個商品 end note class Order { - List<Product> proList; } Order "1"-->"n" Product @enduml
4、聚合關係(Aggregation)
聚合關係是關聯關係的一種特例,聚合關係表示的是一種整體和部分的關係,has-a。比如,Family和Child,Child是Family的一部分,再比如Company和Staff。聚合關係在程式中的體現和上面的關聯關係是一樣的,只能在語義層面進行區分。可以看出,聚合時一種比一般關聯關係更強的關係,需要有整體和部分的聯絡。

聚合關係
@startuml Title "聚合" note as N1 一個家庭可能 有0..n個孩子 end note class Family { - List<Child> children; } Family "1" o-- "0..n" Child:Contains @enduml
5、組合(composition)
組合關係亦是一種特殊的關聯關係,和上面的聚合關係一樣,也表示一種整體和部分的關係。不同於聚合組合關係中的部分,離開整體沒有意義,只能依附於整體存在。比如,汽車和汽車的引擎,引擎是汽車的一部分,離開汽車,引擎在當前的建模語境中沒有意義。可以看出,組合是比聚合更強的關聯關係。程式實現中,組合關係和一般的關聯關係也沒有區別,只能從語義層面區分。
在UML中,組合關係以實心菱形加實線箭頭表示。

組合關係
@startuml Title "組合" note as N1 一輛車有且 只有一個引擎 引擎離開車沒有意義 end note class Car { - Engine e; } Car "1" *-- "1" Engine:Has @enduml
5、總結
上面提到的集中關聯關係中,繼承和實現是縱向的。其它的集中關係,都是類之間橫向的關係。關聯、聚合和組合在程式實現上,沒有區分,只是語義上的差別。然而,通過這幾種關係能幫助我們在設計類時能夠理順思路,實現上少走彎路。
參考連結
- ofollow,noindex">類和類之間的依賴、關聯、聚合、組合關係
- UML類圖
- PlantUML網站:類圖的語法和功能
- OO class relationship