OOP
物件導向程式設計(Object-Oriented Programming)的核心概念。
Objects (物件)
- 物件是類別的實例
- 對應於現實世界的實體,也稱為執行時期實體
- 包含方法和屬性,使資料變得有用
- 在記憶體中佔用空間並有地址
- 具有狀態(state)和行為(behaviour)
Classes (類別)
類別是建立物件的藍圖,封裝資料和操作該資料的方法。
特性:
- 邏輯上的概念,不佔用記憶體空間
- 也稱為物件的模板
- 類別內定義的變數稱為實例變數
- 類別內定義的方法和變數稱為成員
類別宣告組成:
- 修飾詞 (Modifiers): public, protected, default, private
- 類別名稱 (Class name): 首字母大寫
- 父類別 (Superclass): 只能繼承一個父類別
- 介面 (Interfaces): 可實作多個介面
- 主體 (Body): 由大括號
{ }包圍
Abstraction (抽象)
抽象是只顯示必要資訊並隱藏不必要資訊的過程。
核心概念:
- 主要目的是資料隱藏
- 從大量資料中選擇需要顯示的資訊
- 減少程式複雜度和開發工作量
- 抽象類別可宣告一個或多個抽象方法
- 抽象方法有定義但沒有實作
- 當多個子類別需要以不同方式執行相同任務時使用
Abstract vs Interface
| 方面 | Abstract Class | Interface |
|---|---|---|
| 實例化 | 不能直接實例化 | 不能直接實例化 |
| 繼承 | 子類別使用 extends 繼承 | 類別使用 implements 實作 |
| 建構子 | 可以有建構子 | 不能有建構子 |
| 欄位 | 可以有實例變數 | 只能宣告常數 (static final) |
| 方法 | 可以有抽象和具體方法 | 只能宣告抽象方法 |
| 多重繼承 | 只能繼承一個抽象類別 | 可以實作多個介面 |
| 程式碼重用 | 提供共同基類和共享行為 | 定義多個類別需遵循的契約 |
| 使用時機 | 需要提供共享功能的共同基類 | 定義不相關類別應實作的契約 |
| 擴展性 | 可添加新方法的預設實作 | 可添加新方法而不破壞現有程式碼 |
Inheritance (繼承)
繼承表示「is-a」關係。
類型:
- Single (單一繼承): 一個子類別繼承一個父類別
- Multilevel (多層繼承): A → B → C 的繼承鏈
- Multiple (多重繼承): 一個類別繼承多個父類別(某些語言不支援)
- Hierarchical (階層繼承): 多個子類別繼承同一個父類別
- Hybrid (混合繼承): 上述類型的組合
Polymorphism (多型)
多型指多種形式,或以不同方式執行單一動作的過程。
類型:
| 類型 | 別名 | 說明 |
|---|---|---|
| Compile-Time | Static Polymorphism | 編譯時期解析,透過方法覆載 (Overloading) 實現 |
| Runtime | Dynamic Method Dispatch | 執行時期動態解析被覆寫的方法 |
靜態繫結 (Static Binding): 編譯時期就決定呼叫哪個物件的方法,物件會被分配不同的記憶體空間。
動態繫結 (Dynamic Binding): 編譯時期不繫結,而是建立虛擬表格 (Virtual Table),執行時期再判斷呼叫哪個方法。透過父類別的物件參考來選擇執行子類別物件的方法,實現真正的多型。
Encapsulation (封裝)
封裝是將資料和程式碼綁定為單一單元的過程,保護它們不受外部干擾和誤用。也稱為資料隱藏。
Coupling (耦合)
耦合表示一個物件或類別對另一個的了解程度。當一個類別的屬性或行為改變時,會影響另一個相依類別。
| 類型 | 說明 |
|---|---|
| Tight Coupling (緊耦合) | 模組之間高度相依 |
| Loose Coupling (鬆耦合) | 模組之間低度相依,透過抽象介面互動 |
Cohesion (內聚)
內聚表示類別具有單一、明確職責的程度。與單一職責原則 (SRP) 相關。
Association (關聯)
關聯表示物件之間「知道」彼此。可以是一對一、一對多、多對一、多對多。
範例:
- 一輛公車只能有一個司機 (一對一)
- 多位乘客可以搭乘同一輛公車 (多對一)
- 一位乘客可以搭乘不同公車 (一對多)
- 多位乘客可以搭乘多輛不同公車 (多對多)
Aggregation (聚合)
聚合是「has-a」關係,是一種弱關聯。
特性:
- 部分可以獨立於整體存在
- 只有一對一關聯
- 物件之間的弱關聯
Composition (組合)
組合是「belongs-to」關係,生命週期相互綁定。
特性:
- 被包含的物件不能獨立存在
- 物件之間的強關聯
- 當整體被銷毀時,部分也會被銷毀
Composition vs Inheritance
| Composition | Inheritance |
|---|---|
| 表示 Has-A 關係 | 表示 Is-A 關係 |
| 較容易更改包含物件的實作 | 一個實作改變會影響整個繼承層級 |
| 動態或執行時期繫結 | 靜態或編譯時期繫結 |
| 前端類別介面可輕易更改 | 方法或原型的任何更改都會影響所有類別 |
| 當不需要添加更多特性時使用 | 當需要添加更多功能到繼承類別時使用 |
Message Passing (訊息傳遞)
訊息傳遞是程序之間的溝通現象。
類型:
- Synchronous (同步): 物件同時運行時發生
- Asynchronous (非同步): 接收物件可能處於關閉或忙碌狀態
OOP 優缺點
優點:
- 可重用性 (Re-usability)
- 減少資料冗餘 (Data redundancy)
- 程式碼維護 (Code maintenance)
- 安全性 (Security)
- 設計優勢 (Design benefits)
- 容易除錯 (Easy troubleshooting)
缺點:
- 需要較多開發工作
- 相比其他程式速度較慢
- 程式體積較大