# 0. 物件導向名詞解釋 ### 實例變數 VS static 靜態變數 | | 實例變數 | static | | -------- | -------- | -------- | | 屬於誰 | 每個==物件==有自己的實例變數 | 整個==類別==共用一份靜態變數 | ### 類別 * 可以直接實例化 * 可寫實例變數 * 可寫實例方法 ::: success 類別->就像工廠有完整的製造步驟跟說明,可以直接製造產品 ::: ### 抽象類別 Abstract Class * ==不能==直接實例化,繼承抽象類別的子類別比須把抽象方法實作出來才可以實例化 * 可寫實例變數 * 可寫實例方法 * ==可寫抽象方法==(沒有寫實做) 有`打招呼()`方法,但是沒有定義具體會說什麼句子 ::: success 媽媽請你去買菜,給了一份購物清單,醬油1瓶、高麗菜1顆,買一種你喜歡的水果回家,但是沒說買什麼水果,給你自由發揮 抽象類別->有些地方定義好了,有些沒有,實作的時候必須自己定義好 ::: ### 介面 Interface * 不能直接實例化,實作介面的類別才可以實例化 * 不能寫實例變數 * 可寫抽象方法(沒有寫實做) * 可寫實例方法(預設方法),實作類別可以直接繼承或是覆寫 - 好處 :+1: - 解決版本相容問題:你可以在不破壞舊程式碼的情況下,為介面新增方法 ::: info 例子: 抽象方法必須在實作類別中實作,如果想為角色介面新增一個跳舞抽象方法,那每個實作類別(精靈、哥布林...)都要把跳舞方法實作出來,如果他們都是跳同一種舞,則會多出很多重複的程式碼->使用實例方法,大家都有預設的一套跳舞動作!大叔類別可以覆寫`跳舞()`改成跳騎馬舞~ ::: - 提供通用邏輯:避免每個實作類別都寫一樣的程式碼 :::success 介面->客戶寫了一張需求單,要有這些功能,沒有寫怎麼做,他也不知道怎麼做,但你實作介面時必須把功能做出來 ::: --- ## 實作 ### Python - 沒有介面語法怎麼模擬介面? - **使用 abc 模組(Abstract Base Class)** 這是 Python 提供的「類似 interface 的做法」,可以讓你強制子類一定要實作某些方法。 ```python from abc import ABC, abstractmethod class Animal(ABC): # 繼承 ABC 類別 @abstractmethod def speak(self): pass class Dog(Animal): def speak(self): print("Woof!") # ✅ 必須實作,否則無法實例化 class Cat(Animal): def speak(self): print("Meow!") d = Dog() # OK c = Cat() # OK a = Animal() # ❌ TypeError:不能實例化抽象類 ```
{"title":"0. 物件導向名詞解釋","description":"可以直接實例化","contributors":"[{\"id\":\"ae18ebbd-b475-4775-bb0f-66e046171aa3\",\"add\":1610,\"del\":240}]"}
Expand menu