---
# System prepended metadata

title: 0. 物件導向名詞解釋

---

# 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：不能實例化抽象類
```