歡迎來到物件導向程式設計 (OOP) 的世界!

在本章中,我們將探索一種強大的程式編寫方式,稱為物件導向程式設計 (Object-Oriented Programming, OOP)。如果你曾覺得程式碼在規模變大時會變得雜亂無章,那麼 OOP 就是你的救星。它讓我們不再只是處理一長串的指令,而是透過思考程式中的「物件」(Objects) 來組織程式碼。

如果一開始覺得這些概念有點抽象,別擔心! 讀完這些筆記後,你會發現這其實就像是在向電腦描述現實世界一樣自然。


1. 為什麼要使用物件導向範式?

範式 (Paradigm) 這個詞僅僅是指「一種思考方式」。在 OOP 出現之前,大多數人使用程序導向程式設計 (procedural programming)(即編寫一連串的步驟)。那麼,我們為什麼要轉向 OOP 呢?

主要優點:

  • 可重用性 (Reusability): 你可以編寫一次程式碼,然後在程式的不同部分多次重複使用。
  • 可維護性 (Maintainability): 由於程式碼被組織成「物件」,尋找並修復程式錯誤會變得容易得多。
  • 效率 (Efficiency): 這讓開發團隊能夠同時處理大型專案的不同部分,更加事半功倍。

快速回顧: 想像一家汽車工廠。他們不需要為每一輛車重新發明輪子,而是擁有一份可以不斷重複使用的「藍圖」。這正是 OOP 的核心所在!


2. 藍圖與成品:類別與物件

要理解 OOP,你必須搞懂類別 (Class)物件 (Object) 之間的區別。這是本章最重要的概念!

什麼是類別 (Class)?

類別是一個範本或藍圖。它定義了某個東西的外觀和功能,但它本身並不是那個「東西」。
例子:房子的藍圖。你不能住在藍圖裡面!

什麼是物件 (Object)?

物件是從類別中建立出來的特定「實體」。我們稱之為該類別的實例 (Instance)
例子:根據藍圖建造出來的實際房屋。這才是你可以居住的地方!

記憶小撇步: Class (類別) = Concept (概念) | Object (物件) = Operational thing (實際運作的實體)。


3. 屬性與方法(「擁有」與「執行」)

在每個類別內部,都有兩個主要組成部分:屬性 (Attributes)方法 (Methods)

屬性 (Property / Attribute)

這些是物件的資料或特性。你可以把它們想像成名詞
「汽車 (Car)」類別的例子:顏色 (color)、油量 (fuel_level)、最高時速 (max_speed)。

方法 (Method)

這些是物件可以執行的動作。它們是類別內部的子程式(函式或程序)。你可以把它們想像成動詞
「汽車 (Car)」類別的例子:駕駛 (drive())、煞車 (brake())、加油 (refuel())。

你知道嗎? 在程式碼中,屬性看起來通常像變數,而方法看起來則像函式!


4. 實踐:實例化 (Instantiation)

實例化只是一個術語,意思是「從類別建立物件」。當你編寫程式碼來製作範本的新版本時,你就是在進行實例化

步驟流程:
1. 定義類別(藍圖)。
2. 使用特定指令(在 Java/C# 等語言中通常是關鍵字 new,或在 Python 中直接呼叫類別名稱)來觸發實例化
3. 電腦會為該特定的物件分配記憶體空間。

重點總結: 一個類別可以用來建立成千上萬個獨一無二的物件(實例)。


5. 保持隱私:封裝 (Encapsulation)

封裝的概念是將資料(屬性)和操作該資料的方法「打包」成一個單一的單元(類別)。它還涉及資料隱藏 (data hiding)

類比說明: 想像一顆藥丸膠囊。你知道藥物就在裡面,並且會發揮特定作用,但你不需要直接觸摸粉末,也不需要知道它是如何混合的。你只需要吞下這顆膠囊即可。

在程式設計中,我們通常將屬性設為私有 (private),以防從類別外部被意外更改。你只能透過公開 (public) 的方法來更改它們。

常見誤區: 別把封裝僅僅理解為「分組」。它的核心目的是保護物件內部的資料。


6. 家族血緣:繼承 (Inheritance) 與覆寫 (Overriding)

繼承 (Inheritance)

繼承允許一個新的類別(子類別 (subclass) 或衍生類別)繼承現有類別(父類別 (superclass) 或基底類別)的屬性和方法。

例子:「動物 (Animal)」類別具有屬性 '體重 (weight)' 和方法 '進食 (eat())'。「狗 (Dog)」類別可以繼承這些屬性與方法,因此你不需要重新編寫一遍!

覆寫 (Overriding)

有時候,子類別希望以與父類別不同的方式行事。覆寫是指子類別提供了一個繼承方法的專屬版本。

例子:「動物 (Animal)」類別有一個名為 '發出聲音 (make_sound())' 的方法。「狗 (Dog)」類別繼承了它,但進行了覆寫,使其輸出「汪汪!」。而「貓 (Cat)」類別則會將其覆寫為輸出「喵喵!」。

快速回顧盒:
繼承 = 「我要使用父類別擁有的東西。」
覆寫 = 「我要繼承父類別的功能,但我會用自己的方式來執行。」


7. 關聯 (Association):物件如何連結

關聯描述了兩個不同類別之間的關係。它定義了物件如何「認識」或「使用」彼此。這通常被描述為一種「擁有 (has-a)」的關係。

例子:一個教師 (Teacher) 物件和一個學生 (Student) 物件。教師與學生相關聯。教師「擁有」一份學生名單。

不同於繼承(其中一個類別另一種類型),關聯僅僅是兩個獨立物件之間的合作關係。


總結檢查表

考試前,請確保你能用自己的話解釋這些術語:

類別 (Class): 範本/藍圖。
物件 (Object): 從類別建立的實例。
屬性 (Attribute): 資料(例如:姓名、年齡)。
方法 (Method): 行為(例如:執行、儲存)。
實例化 (Instantiation): 建立物件的過程。
封裝 (Encapsulation): 隱藏內部資料以確保安全。
繼承 (Inheritance): 將特徵從父類傳遞給子類。
覆寫 (Overriding): 修改繼承來的方法。
關聯 (Association): 兩個物件之間的關係。

做得好!你剛剛掌握了物件導向程式設計的基礎。試著在小段程式碼中找出這些概念,你很快就能完全駕馭這個主題了!