abstract class 與 interface 差異在語法與編程層面屬低層次非本質。本文從設計哲學層面分析二者本質區別,唯有此層面能真正理解概念核心。
abstract class 體現繼承關係("is-a" 關係),父類與派生類概念本質必須相同。interface 僅要求實作者遵守契約,不要求概念本質一致。
問題領域有 Door 抽象概念,具備 open、close 兩動作。現需增加報警功能 (alarm),如何設計類結構?
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 的模組因報警器變更而受影響,反之亦然。
Java 不支援多重繼承,故雙抽象類不可行。剩餘:雙介面、或抽象類+介面。
若理解: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 相似但選擇反映對概念本質理解與設計意圖是否正確合理,因表達不同概念關係(雖功能均可實現)。此為語言慣用法,請細細體會。