歡迎來到物件的世界!

在你目前的編程旅程中,你可能主要集中於程序式編程(procedural programming)——即編寫一系列讓電腦逐步執行的指令。但隨著程式變得越來越龐大,它們可能會變得像一團混亂的「意大利麵條程式碼」(spaghetti code)——既混亂又難以除錯!

在本章中,我們將探討物件導向編程(Object-Oriented Programming, OOP)。這是一種不同的「範式」(思考模式),我們圍繞著物件(objects)——例如用戶、汽車或遊戲角色等現實世界的事物——來組織程式碼,而不是僅僅關注動作。這使得程式碼更容易重用、組織和維護。如果起初覺得有點抽象,別擔心,我們會一步一步為你拆解!

3.9.1 類別、物件與實例化

什麼是類別和物件?

理解類別(class)物件(object)之間區別的最簡單方法,就是將它們想像成「藍圖」和「房屋」。

類別是一個藍圖或模板。它定義了某個事物看起來是什麼樣子,以及它能做什麼,但它本身並不是該事物。

物件則是根據該藍圖建造出來的實際成品。它是類別的一個特定「實例」(instance)。

例子:想像一個「餅乾模具」(類別)和「餅乾」(物件)。模具定義了形狀,但餅乾才是你真正能吃到的東西!

屬性與方法

在類別內部,我們定義了兩個主要部分:

1. 屬性(Properties 或 Attributes): 這些是物件關於自身的數據。你可以把它們想像成「名詞」。
2. 方法(Methods): 這些是物件可以執行的函數或動作。你可以把它們想像成「動詞」。

類比:如果我們有一個名為「狗」(Dog)的類別
屬性名字(name)、品種(breed)、顏色(color)、年齡(age)。
方法吠叫(bark)、進食(eat)、睡覺(sleep)。

實例化

實例化(Instantiation)只是一個描述「創建物件」的專業詞彙。當你編寫程式碼來製作類別的一個新版本時,你就是在實例化它。

快速回顧:
類別 (Class): 藍圖/模板。
物件 (Object): 從模板創建出來的特定事物。
屬性 (Property): 儲存在物件中的數據(例如:顏色)。
方法 (Method): 物件可以執行的動作(例如:移動)。
實例化 (Instantiation): 製作該物件的過程。


OOP 的核心概念

封裝 (Encapsulation)

封裝是指將數據(屬性)和方法捆綁在一起形成一個單元(類別),並向外界「隱藏」其內部運作方式的理念。這通常被稱為「數據隱藏」。

為什麼要這樣做? 它可以防止程式的其他部分意外地以錯誤的方式修改物件的數據。

類比:電視遙控器。你知道按下哪些按鈕(介面),但不需要看到內部的電線和電路(封裝)就能讓它運作。

繼承 (Inheritance)

繼承允許一個類別取得另一個類別的屬性和方法。我們將原始類別稱為父類別(parent class)或超類別,而新的類別稱為子類別(child class)或次類別。

這非常有用,因為它讓我們免於反覆編寫相同的程式碼!

例子:「車輛」(Vehicle)類別可能具有「速度」和「燃料」等屬性。「汽車」(Car)類別可以從「車輛」繼承,因為汽車「是一種」(IS-A)車輛。它會自動獲得「速度」和「燃料」,然後你可以再添加汽車專屬的屬性,例如「車門數量」。

覆寫 (Overriding)

有時候,子類別想以不同的方式執行某個操作。覆寫是指子類別為父類別中已經定義的方法提供自己的版本。

例子:「鳥類」(Bird)父類別可能有一個名為 fly() 的方法。「企鵝」(Penguin)子類別繼承自 Bird,但因為企鵝不會飛,你可以覆寫 fly() 方法,使其顯示為「我改為游泳!」

關聯 (Association)

關聯描述了兩個不同類別之間的關係,其中一個類別「使用」或「擁有」另一個類別,但它們並不一定是父子關係。這就是物件之間如何對話的方式。

例子:「教師」(Teacher)類別和「學生」(Student)類別。它們之間存在關聯,因為教師教導學生,但教師並不是學生的一種(所以這不是繼承)。

你知道嗎?
大多數現代軟件,從你手機上的應用程式到大型銀行系統,都是使用這些 OOP 原則構建的。因為這讓多名程式設計師能夠同時處理不同的「物件」,而不會干擾彼此的程式碼,極大地提高了開發效率!


常見誤區

1. 混淆類別與物件: 記住,你無法「駕駛」汽車的藍圖。你必須實例化該類別,才能得到一個真正可以使用的物件。
2. 忘記封裝: 初學者經常將所有屬性設為「公開」(public,意味著任何東西都能修改它們)。嘗試將數據保持為私有(private),並使用方法來安全地修改數據。
3. 過度使用繼承: 只有在存在「是一種」(IS-A)關係時才使用繼承(例如:狗「是一種」動物)。不要僅僅為了節省打字而使用它!


重點總結

• 為何使用 OOP? 為了更好地組織、重用和維護大型程式。
• 類別 vs 物件: 類別是模板;物件是特定的實例。
• 封裝: 將數據安全地隱藏在物件內部。
• 繼承: 將特徵從父類別傳遞給子類別。
• 覆寫: 修改父類別的方法以符合子類別的特定需求。
• 關聯: 不同的物件如何相互聯繫或互動。

如果起初覺得有點棘手,別擔心!只要你在編碼中多加練習創建自己的類別和物件,這些概念就會逐漸變得像本能一樣。你可以做到的!