# 【Typescript】類別
---
# 物件導向 (Object Oriented)
- Java
- Python
- JS也有,但沒有那麼嚴謹
---
## 所有東西都是物品
```ts=
class Caculator {
private name: string;
constructor(name: string) {
this.name = name;
}
public add(a: number, b: number): number {
return a + b;
}
public sub(a: number, b: number): number {
return a - b;
}
public mul(a: number, b: number): number {
return a * b;
}
public div(a: number, b: number): number {
return a / b;
}
}
```
---
## 所有東西都是物品
```ts=
import Caculator from './Caculator';
const caculator = new Caculator('example');
console.log(caculator.add(1, 2));
console.log(caculator.sub(1, 2));
console.log(caculator.mul(1, 2));
console.log(caculator.div(1, 2));
```
---
- 類別: 只會有一個
```ts=
class ....
```
- 物件: 可以有很多個
```ts=
const caculator = new Caculator('example');
const caculator2 = new Caculator('mycaculator');
```
---
## 建構子
```ts=
constructor(name: string) {
this.name = name;
}
```
---
## this
要使用class內部的方法、取得class內部的變數要使用this
---
## OOP的三大特性
- 封裝
- 繼承
- 多形
---
## 封裝
不用知道別人的class怎麼寫的就可以直接使用
---
## 繼承
可以繼承別的class的內容,並新增自己需要的功能上去
```ts=
class ScientificCaculator extends Caculator {
constructor(name: string) {
super(name);
}
...
}
```
---
## 多形
同一個方法在不同子類別裡面,可以有不同的實作方法
---
## getter & setter
用以改變屬性的讀取和賦值行為
```ts=
class Caculator {
private name: string;
constructor(name: string) {
this.name = name;
}
...
get Name(): string {
return this.name;
}
set Name(name: string) {
this.name = name;
}
}
```
---
## 修飾符
- public
- 任何人都可以存取,預設值
- protected
- 只有同一個家族的可以存取
- private
- 只有自己可以存取
---
- readonly
- 只能讀不能寫,可以和其他的一起寫
---
## 抽象 Abstract
- 抽象的方法
- 抽象的類別
---
### 抽象的方法
```ts=
class Caculator {
private name: string;
constructor(name: string) {
this.name = name;
}
public abstract add(a: number, b: number): number {
return a + b;
}
public abstract sub(a: number, b: number): number {
return a - b;
}
public abstract mul(a: number, b: number): number {
return a * b;
}
public abstract div(a: number, b: number): number {
return a / b;
}
}
```
```ts=
Caculator.add(1 + 2)
```
---
### 抽象的類別
- 抽象類別不能被實例化
- 子類別要自己寫抽象方法
```ts=
absract class Caculator {
private name: string;
constructor(name: string) {
this.name = name;
}
public abstract add(a: number, b: number);
public abstract sub(a: number, b: number);
public abstract mul(a: number, b: number);
public abstract div(a: number, b: number);
}
```
---
## 一些參考資料
[TSHandbook 中文版](https://zhongsp.gitbooks.io/typescript-handbook/content/doc/handbook/Classes.html)
[ES6入門-Classes](https://es6.ruanyifeng.com/#docs/class)
{"title":"【Typescript】類別","contributors":"[{\"id\":\"5e26c66d-5ac6-4b0e-accd-3b5bb90a4d07\",\"add\":3168,\"del\":449}]","description":"java"}