淺析Is-a,Has-a與like-a

rttrti發表於2021-09-10

在物件導向的設計領域裡,有很多設計思路,主要有三種:is-a、has-a、like-a
這三種在java的類、介面、抽象類中很多體現,下面簡述一下其定義。

1.Is-a(繼承關係)

  • is-a,顧名思義,“是一個”,是一種繼承關係。

如果A is-a B,那麼B就是A的父類。
一個類完全包含另一個類的所有屬性及行為。
例如PC機是計算機,工作站也是計算機,PC機和工作站是兩種不同型別的計算機,但都繼承了計算機的共同特性。因此在用Java語言實現時,應該將PC機和工作站定義成兩種類,均繼承計算機類。

2.Has-a(從屬關係)

  • has-a,顧名思義,“有一個”,代表從屬關係。

如果A has a B,那麼B就是A的組成部分。
同一種類的物件,通過它們的屬性的不同值來區別。
例如一臺PC機的作業系統是Windows,另一臺PC機的作業系統是Linux。作業系統是PC機的一個成員變數,根據這一成員變數的不同值,可以區分不同的PC機物件。

3.like-a(組合關係)

  • like-a,顧名思義,"像一個",代表組合關係。

如果A like a B,那麼B就是A的介面。
新型別有老型別的介面,但還包含其他函式,所以不能說它們完全相同。
例如一臺手機可以說是一個微型計算機,但是手機的通訊功能顯然不是計算機具備的行為,所以手機繼承了計算機的特性,同時需要實現通訊功能,而通訊功能需要作為單獨介面,而不是計算機的行為。

4.is-a,has-a,like-a如何應用

  1. 如果你確定兩件物件之間是is-a的關係,那麼此時你應該使用繼承;比如菱形、圓形和方形都是形狀的一種,那麼他們都應該從形狀類繼承。
  2. 如果你確定兩件物件之間是has-a的關係,那麼此時你應該使用聚合;比如電腦是由顯示器、CPU、硬碟等組成的,那麼你應該把顯示器、CPU、硬碟這些類聚合成電腦類。
  3. 如果你確定兩件物件之間是like-a的關係,那麼此時你應該使用組合;比如空調繼承於製冷機,但它同時有加熱功能,那麼你應該把讓空調繼承製冷機類,並實現加熱介面。