OOP

物件導向程式設計(Object-Oriented Programming)的核心概念。

Objects (物件)

  • 物件是類別的實例
  • 對應於現實世界的實體,也稱為執行時期實體
  • 包含方法和屬性,使資料變得有用
  • 在記憶體中佔用空間並有地址
  • 具有狀態(state)和行為(behaviour)

Classes (類別)

類別是建立物件的藍圖,封裝資料和操作該資料的方法。

特性:

  • 邏輯上的概念,不佔用記憶體空間
  • 也稱為物件的模板
  • 類別內定義的變數稱為實例變數
  • 類別內定義的方法和變數稱為成員

類別宣告組成:

  1. 修飾詞 (Modifiers): public, protected, default, private
  2. 類別名稱 (Class name): 首字母大寫
  3. 父類別 (Superclass): 只能繼承一個父類別
  4. 介面 (Interfaces): 可實作多個介面
  5. 主體 (Body): 由大括號 { } 包圍

Abstraction (抽象)

抽象是只顯示必要資訊並隱藏不必要資訊的過程。

核心概念:

  • 主要目的是資料隱藏
  • 從大量資料中選擇需要顯示的資訊
  • 減少程式複雜度和開發工作量
  • 抽象類別可宣告一個或多個抽象方法
  • 抽象方法有定義但沒有實作
  • 當多個子類別需要以不同方式執行相同任務時使用

Abstract vs Interface

方面Abstract ClassInterface
實例化不能直接實例化不能直接實例化
繼承子類別使用 extends 繼承類別使用 implements 實作
建構子可以有建構子不能有建構子
欄位可以有實例變數只能宣告常數 (static final)
方法可以有抽象和具體方法只能宣告抽象方法
多重繼承只能繼承一個抽象類別可以實作多個介面
程式碼重用提供共同基類和共享行為定義多個類別需遵循的契約
使用時機需要提供共享功能的共同基類定義不相關類別應實作的契約
擴展性可添加新方法的預設實作可添加新方法而不破壞現有程式碼

Inheritance (繼承)

繼承表示「is-a」關係。

類型:

  • Single (單一繼承): 一個子類別繼承一個父類別
  • Multilevel (多層繼承): A → B → C 的繼承鏈
  • Multiple (多重繼承): 一個類別繼承多個父類別(某些語言不支援)
  • Hierarchical (階層繼承): 多個子類別繼承同一個父類別
  • Hybrid (混合繼承): 上述類型的組合

Polymorphism (多型)

多型指多種形式,或以不同方式執行單一動作的過程。

類型:

類型別名說明
Compile-TimeStatic Polymorphism編譯時期解析,透過方法覆載 (Overloading) 實現
RuntimeDynamic 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

CompositionInheritance
表示 Has-A 關係表示 Is-A 關係
較容易更改包含物件的實作一個實作改變會影響整個繼承層級
動態或執行時期繫結靜態或編譯時期繫結
前端類別介面可輕易更改方法或原型的任何更改都會影響所有類別
當不需要添加更多特性時使用當需要添加更多功能到繼承類別時使用

Message Passing (訊息傳遞)

訊息傳遞是程序之間的溝通現象。

類型:

  • Synchronous (同步): 物件同時運行時發生
  • Asynchronous (非同步): 接收物件可能處於關閉或忙碌狀態

OOP 優缺點

優點:

  • 可重用性 (Re-usability)
  • 減少資料冗餘 (Data redundancy)
  • 程式碼維護 (Code maintenance)
  • 安全性 (Security)
  • 設計優勢 (Design benefits)
  • 容易除錯 (Easy troubleshooting)

缺點:

  • 需要較多開發工作
  • 相比其他程式速度較慢
  • 程式體積較大