| 特性 | abstract class | interface |
|---|---|---|
| 資料成員 | 可擁有任意修飾符的欄位 | 僅限 static final 常數 |
| 方法實作 | 可包含具體方法與抽象方法 | Java 8 前僅抽象方法;Java 8+ 可有 default/static 方法 |
| 建構子 | 可定義建構子(供子類呼叫) | 不可有建構子 |
extends 一個 abstract class,但可 implements 多個 interface(Java 單繼承多實作機制)。Door 為核心概念,AlarmDoor 本質仍是 Door。Alarm 介面代表「具備報警能力」,AlarmDoor 同時是 Door 且具備 Alarm 能力。// 正確設計:核心概念用 abstract class,橫向能力用 interface
abstract class Door { abstract void open(); abstract void close(); }
interface Alarm { void alarm(); }
class AlarmDoor extends Door implements Alarm { ... }
若雙方皆用 interface,無法表達「AlarmDoor 本質是 Door」的領域知識;若雙方皆用 abstract class,Java 單繼承限制導致無法同時繼承。
abstract class 與 interface 的選擇不僅是語法偏好,更反映對領域模型本質的理解。正確運用兩者差異,能讓設計更清晰地傳達業務語意,降低維護認知負擔。