物件導向與進階程式設計:類別、物件與實例化

哈囉!歡迎來到現代電腦科學中最令人興奮且核心的觀念之一:物件導向程式設計(Object-Oriented Programming, OOP)。別擔心術語聽起來很生硬;我們將透過現實生活中的例子來拆解它。

在本章中,我們將學習如何以「物件」(objects)為核心來架構程式,而不是僅僅排列一連串的動作。這種方法能協助我們構建龐大且複雜的程式,使其更易於管理、偵錯與重複使用。精通類別與物件對於 A-Level 程式設計的成功至關重要!

為什麼要使用物件導向程式設計(OOP)?

使用物件導向範式(Object-Oriented Paradigm)的核心原因,在於能更精準地在程式碼中模擬真實世界的系統。它透過提供結構與組織,幫助我們駕馭大型程式的複雜度。

使用 OOP 的優點:

  • 模組化(Modularity): 程式由獨立的單元(物件)構成,讓程式碼更容易測試與維護。
  • 可重複使用性(Reusability): 一旦定義好類別,你就可以重複創建許多物件,而無需重新撰寫定義。
  • 抽象化(Abstraction): 你只需與你需要的介面互動,而無需理會複雜的內部運作細節。
  • 可擴展性(Scalability): 透過建立與現有類別互動的新類別,可以更輕鬆地增加新功能或擴充程式。


1. 類別(Classes):藍圖

想像一下,你想為一款模擬遊戲製作 10 輛不同的賽車。你肯定不會把完整的設計圖重畫 10 次,對吧?你會先建立一個總體規劃或樣板。

在 OOP 中,這個總體規劃就是類別(Class)

類別是一個定義或藍圖,用來描述該類型所有物件都將具備的特性(數據)與行為(動作)。它本身不是物件,而是用於創建物件的結構。

類別定義的關鍵組成

類別將數據與操作這些數據的函式整合在一起:

1. 屬性或特徵(Property or Attribute):
這些是定義物件特性的數據項目。它們就像類別定義內包含的變數。

  • 類比: 如果類別是車子(Car),屬性可能就是顏色(Colour)最高時速(MaxSpeed)引擎排氣量(EngineSize)

2. 方法(Method):
這些是定義在類別內部的函式或副程式,描述了物件可以執行的動作,或是可以對物件執行的動作。

  • 類比: 如果類別是車子(Car),方法可能就是駕駛(Drive())剎車(Brake())鳴喇叭(HonkHorn())

快速複習:類別結構

一個類別(Class) = (數據/屬性) + (函式/方法


2. 物件(Objects):實際的實體

如果類別是車子的藍圖,那麼物件(Object)就是停在路上那輛真正的車子。

物件是類別的一個實例(instance)。它是根據類別藍圖所創建的具體實體。每個物件都會擁有一組獨特的屬性值,這些屬性都是在類別中定義好的。

  • 範例: 如果我們有一個車子(Car)類別,我們可以創建兩個物件:

物件 A (車子 1):
屬性:顏色 = 藍色
屬性:最高時速 = 200
方法:駕駛()(此方法僅對這輛藍色車子運作)。

物件 B (車子 2):
屬性:顏色 = 紅色
屬性:最高時速 = 180
方法:駕駛()(此方法僅對這輛紅色車子運作)。


你知道嗎? 物件有時也被稱為實例(Instances)。當你創建一個物件時,你就是在製作該類別的一個實例。


3. 實例化與建構子

我們該如何將靜態的藍圖(類別)變成存在於記憶體中、具有功能性的實體(物件)呢?答案是使用實例化(Instantiation)

3.1 實例化(創建過程)

實例化是從類別定義創建新物件的過程。

步驟類比:製作蛋糕(實例化)

1. 類別: 蛋糕的食譜(藍圖)。
2. 實例化: 實際混合材料並烘焙的過程。
3. 物件: 完成後的蛋糕,準備好可以享用(使用)。

當你寫出類似 myCar = NEW Car() 的程式碼時,你就是在執行實例化。這會告訴電腦分配記憶體,並根據車子(Car)類別的定義建構出一個新物件。

3.2 建構子(初始設定)

當物件在實例化過程中被創建時,通常會立即呼叫一個特殊的方法來設定物件,這就是建構子(Constructor)

建構子是一種特殊類型的方法,會在物件從類別實例化時被自動呼叫。

它的主要任務是將物件初始化到特定狀態,意即設定物件屬性(特徵)的初始值、預設值或起始值。

  • 範例: 當你創建一個新的車子(Car)物件時,建構子可能會自動將時速設為 0,將引擎狀態設為關閉,並指派車牌號碼。

常見錯誤: 請勿將建構子與其他方法混淆。雖然兩者都是類別內部的函式,但建構子僅在物件首次創建時執行*一次*,而其他方法(如駕駛())在物件生命週期內則可以被呼叫多次。

✏ 重點總結(定義鏈)

類別(Class)是模板。
物件(Object)是基於模板的具體實體。
實例化(Instantiation)是創建物件的過程。
建構子(Constructor)是在實例化期間執行,用於設定物件起始數據(屬性)的特殊方法。


4. 核心 OOP 觀念概覽(教學大綱定義)

教學大綱要求你必須熟悉以下觀念,這些觀念描述了 OOP 系統中使用的關係與結構技術。我們在此簡要定義:

封裝(Encapsulation)

封裝是將數據(屬性)以及操作該數據的方法綑綁成一個單一單元(類別/物件)。關鍵在於,物件的內部運作與數據表示方式對外部世界是隱藏的,僅能透過定義好的方法來控制存取。這可以防止數據被意外損壞。

繼承(Inheritance)

繼承是一種關係,其中一個類別(子類別衍生類別)基於另一個現有的類別(基底類別父類別),或者說是該類別的更專門化版本。子類別會自動接收基底類別的所有屬性與方法。

  • 類比: 卡車(Truck)類別繼承自一般的車輛(Vehicle)類別。卡車會自動獲得來自車輛引擎排氣量屬性,但也會新增其專屬的屬性,例如貨物容量
覆寫(Overriding)

覆寫發生在子類別重新定義(更改)其從基底類別繼承而來的方法時。這讓子類別物件在呼叫該方法時,表現出與基底類別略有不同且更專門化的行為。

  • 範例: 車輛卡車都有一個啟動引擎(StartEngine())方法。卡車類別可能會覆寫這個方法,加入額外的檢查步驟,反映出啟動重型卡車與啟動小型車輛是不同的。
關聯(Association)

關聯是兩個物件之間的一種關係,其中一個物件可以使用另一個物件。這是一種比繼承(繼承是「是一種」的關係)更弱的關係。它僅代表兩個類別被連結在一起,因為其中一個需要另一個的服務或數據。

  • 範例: 在足球模擬遊戲中,一個球隊(Team)物件與多個球員(Player)物件存在關聯。球隊物件「擁有」或「使用」了球員物件。