抽象類表達「一組固定行為的抽象描述,擁有任意多種具體實現」。它是面向對象設計核心原則 **OCP(開閉原則)** 的關鍵:模塊依賴抽象不變,通過繼承擴展行為。
| 特性 | abstract class | interface |
|---|---|---|
| 數據成員 | 任意 | 僅 static final 常量 |
| 方法實現 | 可有默認實現 | 全抽象(Java 8 前) |
| 繼承關係 | 單繼承 | 多實現 |
| 本質關係 | is-a(繼承) | like-a(契約) |
Door 有 open()、close()alarm() 報警功能interface Door { void open(); void close(); void alarm(); }
❌ 違反 **ISP(介面隔離原則)**:將「門」與「報警器」兩個概念強行合一。依賴 Door 的模塊會因 Alarm 變更而受影響,反之亦然。
Java 不支持多重繼承,故兩個抽象類不可行。可行組合:
| 組合 | 評價 |
|---|---|
| 兩個 interface | 模糊概念本質:AlarmDoor 到底是門還是報警器? |
| abstract class Door + interface Alarm | ✅ 清晰表達:AlarmDoor **是一個** Door,**擁有** Alarm 能力 |
| interface Door + abstract class Alarm | 若領域模型認定 AlarmDoor 本質是報警器,則反過來 |
abstract class Door {
abstract void open();
abstract void close();
}
interface Alarm {
void alarm();
}
class AlarmDoor extends Door implements Alarm {
void open() { ... }
void close() { ... }
void alarm() { ... }
}
選擇 abstract class 還是 interface,**不僅是語法偏好,更是領域模型理解的體現**。abstract class 定義「是什麼」,interface 定義「能做什麼」。正確選型讓代碼語言化設計意圖,降低認知負荷,支撐長期演化。