# 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: `物件導向`