Has-a
此條目可参照英語維基百科相應條目来扩充。 (2024年8月1日) |
has-a(或是has_a、has a)是物件組合的關係[註 1],這是一種以組合為概念的關係[註 2]。
主要是用在資料庫設計與面向对象程序设计以及面向对象的系统分析的程式設計領域,就是一個物件(部件/組合成分/成員)「屬於」另一個物件(複合型態),而且是根據物件的所有權規則來執行動作。這個組合的關係也就是一個物件成為另一個物件的「一部分」,例如物件A成為物件B的一部分也就是物件B的成員。
簡單來說,has-a關係對於物件來說就是物件的成员变量,或是成員物件。多個has-a關係會組成產生一個獨佔性的階層結構。
相關概念
分類性階層(子类型)的is-a關係與has-a是相互對比的概念[註 3]。存在明確的is-a關係才較為適合使用繼承方法。繼承的問題在於各項物件緊密連接而難以修改,還有過度使用會導致混亂的階層結構。以組合的概念來說,只要組合簡單物件即可達成複雜的物件[1]。
範例
ER模型
資料庫的has-a關係通常以ER模型來表示。
如圖所示,以大型多人在线角色扮演游戏為例,一個遊戲帳號可以建立多個遊戲角色,這表示遊戲帳號與遊戲角色兩者之間存在has-a關係[註 4][註 5]。
UML類別圖
统一建模语言的類別圖可以用來表示物件導向程式設計的has-a關係。如圖所示,汽車有化油器的has-a關係,或者汽車的組合部件之一是化油器。汽車方塊右方的黑色菱形表示組合關係。
池塘與鴨子兩者用白色菱形來表示聚合關係,池塘包含鴨子但是無所有權。組合關係有所有權,聚合關係則無所有權。
註釋
參考資料
- ^ Cohen, Sheldon. 優先選用組合而非繼承(Favoring Composition Over Inheritance). Medium. 2023-05-19.