is_a 用於繼承
has_a 是組合 一個類中包含了其他類
一般我們認爲繼承可以分爲兩種基本的形式:實現繼承和接口繼承。
實現繼承的主要目標是代碼重用:
我們發現類B和類C存在同樣的代碼,因此我們設計了一個類A,用於存放通用的代碼。
基於這種思路的繼承稱爲實現繼承。
接口繼承不同,它是基於現實生活中的語義的,表現了IsA的關係:
我們認爲存款帳戶和結算帳戶都是帳戶的子類,這種繼承我們稱之爲接口繼承。
注意,有些文章中一個類實現一個接口的行爲定義爲接口繼承,這和這裏的接口繼承是不同的概念,爲了區分兩種概念,我們可以使用接口繼承的另一種稱呼-類型繼承。
繼承的關鍵就在於如何靈活的運用兩種繼承方式。
這裏的接口的意思和Java或者C#中的interface有着不同。
在此的接口表示的是一個類中所有公有的方法的簽名。
所以IsA關係是關於行爲的。
HasA關係,也稱爲對象組合。實際上,HasA關係有兩種。
第一種,靜態HasA關係。這在UML中叫做組合(composition),比如“汽車has-a引擎”。
此種關係很像聚集,除了‘部分’的生命週期由‘整體’控制。
這種控制可能是直接的或者傳遞的。即‘整體’可能對創建或者銷燬‘部分’具有直接的職責,或者它可能獲得已經創建的部分,稍後傳遞給其它的假定對其有職責的整體。
第二種,動態HasA關係。這在UML中叫做聚合(aggregation),比如“飛機場has-a飛機”。
別忘了use-a 是依賴關係