# 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}]"}