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.