兩種繼承關係的本質差異
等價關係:純粹替換
- 衍生類別只覆寫、不新增介面;
- 衍生類別物件完美替換基底類別物件;
- 關係語意:「是一種」(Is-a)——「圓是一種形狀」。
- 理想的繼承方式,符合里氏替換原則(LSP)。
類似關係:擴充介面
- 衍生類別新增方法,介面變大;
- 仍可替換基底類別,但基底類別參考無法呼叫新方法;
- 關係語意:「類似」(Like-a)——「冷暖氣機類似冷氣機,但功能更多」。
- 現有系統只認得舊介面(冷氣控制),新功能(暖氣)無法被使用。
經典比喻:冷氣機 vs 冷暖氣機
房間只裝了「製冷」控制介面。換成「冷暖氣機」:
- 製冷功能正常運作(介面相容);
- 製熱功能無法被房間系統存取(介面未擴充);
- 這就是類似關係:新型別擴充了介面,但舊系統不知情。
設計啟示
| 場景 | 建議 |
| 衍生類別無新增行為,純粹特化 | 採用等價關係,完美替換 |
| 需要新增公共介面方法 | 類似關係,但需評估:是否應擴充基底介面? |
| 新增方法屬於特定子類別專有 | 類似關係可接受,但避免過度使用 |
里氏替換原則(LSP)
Barbara Liskov 提出:子類別必須能替換其基底類別,且不影響程式正確性。等價關係天然符合 LSP;類似關係若濫用(如覆寫方法拋出新例外、改變語意),會違反 LSP,導致執行期驚喜。
總結
繼承不只是「重用程式碼」,更是「定義型別關係」。區分「等價」與「類似」,能幫助你決定:是單純特化(等價),還是擴充介面(類似)?這直接影響系統的可維護性與擴充性。
- 上一篇文章: Java 多型核心:向上轉型與衍生類別互換使用機制
- 下一篇文章: Java 繼承機制:重用介面與 extends 關鍵字
Copyright ©
程式碼之家 All Rights Reserved