首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> J2EE

深度解析 abstract class 與 interface 本質區別:設計哲學視角

     編輯:J2EE

abstract class 與 interface 差異在語法與編程層面屬低層次非本質。本文從設計哲學層面分析二者本質區別,唯有此層面能真正理解概念核心。

核心觀點

abstract class 體現繼承關係("is-a" 關係),父類與派生類概念本質必須相同。interface 僅要求實作者遵守契約,不要求概念本質一致。

案例說明:Door 與 Alarm

問題領域有 Door 抽象概念,具備 open、close 兩動作。現需增加報警功能 (alarm),如何設計類結構?

方案一:單一介面/抽象類包含所有方法(違反 ISP 原則)

abstract class Door { abstract void open(); abstract void close(); abstract void alarm(); }
// 或
interface Door { void open(); void close(); void alarm(); }
class AlarmDoor extends/implements Door { ... }

違反介面隔離原則 (ISP):將 Door 固有行為與 "報警器" 概念混合,導致依賴 Door 的模組因報警器變更而受影響,反之亦然。

方案二:依 ISP 分離兩概念(三種定義組合)

Java 不支援多重繼承,故雙抽象類不可行。剩餘:雙介面、或抽象類+介面。

雙介面定義的問題

  1. 可能未理解問題領域:AlarmDoor 本質是 Door 還是報警器?
  2. 即使理解正確(AlarmDoor 本質是 Door),雙介面定義無法揭示設計意圖

抽象類 + 介面:正確揭示設計意圖

若理解:AlarmDoor 本質是 Door,同時具備報警功能。
abstract class 表 "is-a" 關係 → 定義 Door
interface 表 "like-a" 關係 → 定義 Alarm

abstract class Door { abstract void open(); abstract void close(); }
interface Alarm { void alarm(); }
class AlarmDoor extends Door implements Alarm { ... }

此實現明確反映問題領域理解與設計意圖。若認定 AlarmDoor 本質是報警器並具 Door 功能,定義方式反之。

結論

abstract class 與 interface 相似但選擇反映對概念本質理解與設計意圖是否正確合理,因表達不同概念關係(雖功能均可實現)。此為語言慣用法,請細細體會。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved