| 特性 | 面向物件 (OO) | 基於物件 (OB) |
|---|---|---|
| 封裝 | ✅ | ✅ |
| 繼承 | ✅ | ❌ |
| 多型 | ✅ | ❌ |
| 能否定義新類型 | ✅ | ❌(僅能使用現成類別) |
| 典型代表 | Java、C++、C#、Smalltalk、Python | JavaScript (ES5)、VB6、VBScript、Flash ActionScript 1/2 |
判斷新技術是否 OO:看能否繼承現有類別產生新類型、能否以父類別型別持有子類別實例(多型)。
老師金句:「C++ 打著面向物件的旗幟,幹著過程式編程的勾當。」 三層含義:
Cloneable、Serializable 等語言層面協議。對擴充開放、對修改關閉。 抽象類別(
abstract class/interface)是關鍵:模組依賴固定抽象,透過繼承/實作擴充行為,無需修改既有程式碼。
| 維度 | abstract class | interface |
|---|---|---|
| 關係語意 | is-a(繼承) | can-do / has-capability(契約) |
| 多重實作 | 單一繼承 | 可多實作 |
| 預設方法 | 可有非 abstract 方法、建構子、欄位 | Java 8+ default/static 方法,無實例欄位 |
| 演進成本 | 新增非 abstract 方法不破壞子類 | Java 8 前新增方法破壞所有實作;default 緩解 |
| 選擇建議 | 共享程式碼、狀態、強 is-a 關係 | 定義能力契約、多重實作、跨層級複用 |
答對這三問,abstract class 與 interface 的選擇就不再隨意。