---
# System prepended metadata

title: '[筆記]物件導向語言'

---

#    [筆記]物件導向語言

## (一)特色
### 1. 封裝性
* 利用類別Class來實作抽象化的資料型態
    * 汽車藍圖(Class)來實作汽車實體 (Instance)
    * 汽車藍圖可能包括:外觀、車色、方向盤等等
    ```c=
    class car{
        color
    }
    
    car1=car()
    car2=car()
    car1.color="red"
    car2.color="white"
    
    ```
* 抽象化的定義
    * 使用者僅能定義方法(Method)來操作介面，而不能直接使用資料，符合<資料隱藏(Information Hiding)>

### 2.繼承
* 減少程式碼重複性
    * 假設汽車與飛機都有共同的Drive方法，為了減少重複而使用父子繼承方法(父:Drive，子:繼承Drive).

### 3.多形
* 一樣東西有多種不同的形態
    * 同樣是Drive父類別，但子類別的Drive可使用同方法名稱但不一樣的實作
        * 交通工具都是開，但是飛機是用飛的開而汽車是行走的開

## (二)與物件導向相對的是函式語言（functional programming）

## (三)[SOLID基本原則](https://skyyen999.gitbooks.io/-study-design-pattern-in-java/content/oodPrinciple.html)

學好SOLID可幫助程式設計師寫出好維護、易擴充的程式架構。不必因為牽一髮而動全身

[七天學會設計模式：設計模式也可以這樣學](https://www.books.com.tw/products/0010750585)
* S : Single Responsibility Principle (單一職責原則)
    * 一個類別只負責一件事情
* O : Open Closed Principle (開放封閉原則)
    * 可以擴充新功能，但不可影響舊功能
* L : Liskov Substitution Principle (里氏替換原則)
    * 在一個系統中，子類別應該可以替換掉父類別而不會影響程式架構。
    * 子類別應可以執行父類別的事件
* I : Interface Segregation Principle (介面隔離原則)
    * 把不同功能的功能從介面中分離出來
* D : Dependency Inversion Principle (依賴反轉原則)
    * 高階模組不應依賴低階模組，兩個都應該依賴在抽象概念上
    ![](https://i.imgur.com/F9YOSV4.png)

## (四)程式=物件+互動
* 物件是具體存在的事物，而互動則是事物之間的相互作用及互動。
* 具有擴充性(系統因應需求變化時，比較容易擴充)
* 應用在經常變化之處

## (五)甚麼是類別?
* 相似事物的統稱(動物、植物、微生物)
* 只要相似物就是同一類!
    * 人、豬，都是哺乳類
    * 人、樹，都是生物
