歡迎來到物件的世界!
在你目前的編程旅程中,你可能主要集中於程序式編程(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 物件: 類別是模板;物件是特定的實例。
• 封裝: 將數據安全地隱藏在物件內部。
• 繼承: 將特徵從父類別傳遞給子類別。
• 覆寫: 修改父類別的方法以符合子類別的特定需求。
• 關聯: 不同的物件如何相互聯繫或互動。
如果起初覺得有點棘手,別擔心!只要你在編碼中多加練習創建自己的類別和物件,這些概念就會逐漸變得像本能一樣。你可以做到的!