---
# System prepended metadata

title: OOP筆記
tags: [物件導向]

---

# OOP筆記

OOP (Object-oriented programming)，也稱物件導向程式設計，是基於物件概念的一種程式設計典範，屬於一種抽象的程式開發方針。

>*程式設計典範是軟體工程中的各種典型設計風格的統稱，常見的有函式程式設計 (Functional programming)、以及OOP…等多種典範，每種情況適合的設計典範都不同，並沒有某種典範絕對優於其他種，甚至有某些情況並沒有合適的典範，需要去研發一種新的。根據情況挑選合適的開發方式是程式開發的重點。*


OOP的設計風格是將整個系統(或稱程式)塑造成許多物件的集合體，每個物件代表整個系統的特定面向。OOP中，物件作為程式的基本單元，將程式與資料封裝其中，再提供一個端口 (interface)，讓物件外的程式可以與其互動，但因其封裝特性，可以維持物件的內部狀態。

---
*範例使用 java程式碼，且為 psuedo code。*

- **Class and instance**
    
    在一個OOP風格的系統中，程式設計師會創造一個抽象定義的物件來表示某種存在，這一段描述不太好懂，舉個例子，如果我現在的系統是一所學校，那我會需要一個物件來表示眾多老師們，每位老師有一些共通的屬性，例如: 他們有名字以及專長的學科；可以向學生們自我介紹、批改作業，以下為範例。
    
    第一行替class命名，並在其中添加該class的相關定義。
    
    - **properties**: 該class的基礎屬性
    - **constructor**: 建構子，其中是一個建構函式，在一個instance產生時，由建構函式初始化自帶的屬性，該函式通常會跟class同名
    - **methods**: 該class的內部函式
    
    ```java
    // psuedo code
    
    class Teacher
      properties
    		name
    		subjects
    	constructor
    		Teacher(name, subjects)
    	methods
    		grade(paper)			
    		introduceSelf()
    ```
    
    編寫完就能使用該class來產生instance
    
    ```java
    watson= new Teacher("Watson", "Math");
    
    watson.subjects;        // Math
    watson.introduceSelf(); // My name is Watson and I will be your Math teacher.
    ```
    
- **Inheritence**
    
    OOP的另一個特性是繼承，透過將某個class的屬性繼承至另一個或多個class，透過此方式來減少重複撰寫程式碼，並提高維護性。
    
    ```java
    //psuedo code
    
    class Person
    	preperties
    		name
    	construtor
    		Person(name)
    	methods
    		introduceSelf()
    
    class Teacher : extends Person
    	preperties
    		subjects
    	construtor
    		Teacher(name, subjects)
    	methods
    		grade(paper)
    		introduceSelf()
    
    class Student : extends Person
    	preperties
    		year
    	construtor
    		Student(name, year)
    	methods
    		introduceSelf()
    ```
    
    在上面的範例中，Person可以稱為Teacher和Student的superclass或parent class；反之，可以稱Teacher是Person的subclass或child class。
    
    introduceSelf之所以要分別各寫一次則是因為，老師和學生的自我介紹方法不同，而Person的introduceSelf則是提供不是老師也不是學生的人一個預設的自我介紹。
    
    ```java
    watson= new Teacher("Watson", "Math");
    watson.introduceSelf(); 
    // My name is Watson and I will be your Math teacher.
    
    peter = new Student("Peter", "2");
    peter.introduceSelf(); 
    // My name is Peter and I'm in the second year.
    
    ashley = new Person("Ashley");
    ashley.introduceSelf();
    // My name is Ashley.
    ```
    
    當一個相同名稱的函式(範例中為introduceSelf)，在不同的class中有不同的執行方式，稱為多型(**polymorphism**)；當subclass中的同名函式取代為他的superclass中繼承過來的函式，此舉動稱為覆寫 (override)。
    
- **Encapsulation**
    
    外部程式不能直接訪問物件內部的資料，而是透過物件提供的端口來訪問，以維持物件內部的私有性，稱為封裝。
    
    ```java
    //psuedo code
    
    class Student : extends Person
    	preperties
    		year
    	construtor
    		Student(name, year)
    	methods
    		introduceSelf()
    		canStudyArchery() { return this.year > 1 }
    ```
    
    ```java
    if ( peter.canStudyArchery() ){
    	// allow the student into the class
    }
    ```
    
    若要禁止外部程式訪問物件內部的資料，可以使用private屬性。
    
    ```java
    class Student : extends Person
    	preperties
    		private year
    	construtor
    		Student(name, year)
    	methods
    		introduceSelf()
    		canStudyArchery() { return this.year > 1 }
    
    amy = new Student("Amy", "1")
    amy.year  // error: 'year' is a private property of Student
    ```
    

參考資料:

[https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Objects/Object-oriented_programming)

###### tags: `物件導向`