TypeScript 基礎:抽象類別

什麼是抽象類別?
抽象類別(Abstract Class)是物件導向設計中的一種類別,它是用來作為其他類別的基礎,無法直接實例化。抽象類別通常會有抽象方法(未實作的方法),子類必須覆寫這些抽象方法,並根據具體需求提供實作。
抽象類別的目的是提供通用的藍圖,讓不同的子類能共用相同的結構和行為,同時允許每個子類根據自身特性實現具體細節。
主要特性
- 無法實例化:抽象類別只能被繼承,不能被直接用來創建物件。
- 抽象方法:抽象類別中可以定義不具體實作的抽象方法,這些方法需要由子類提供具體實現。
- 具體方法:除了抽象方法,抽象類別也可以有具體實作的方法,這些方法可以直接被子類繼承使用。
- 強制子類實作:當子類繼承了抽象類別,必須實作所有的抽象方法,否則子類也必須被聲明為抽象類別。
抽象類別的應用場景
抽象類別最常用於需要一個通用藍圖來約束子類,但同時希望不同子類能有各自的具體實作。這可以防止子類偏離共同結構,也可以減少重複程式碼。常見的應用場景包括:
- 動物類別:定義通用的屬性和行為(例如: 名字和移動),但具體動作由不同動物(子類)決定。
- 交通工具類別:定義通用的操作功能(例如:啟動和停止),但具體的實作由不同交通工具(例如:汽車、飛機等)決定,例如:汽車需要加油,飛機則需要加燃料。
- 通知系統類別:定義通用的通知方法(例如:發送通知),但具體的實作則由不同通知方式(例如:電子郵件、簡訊、推送通知)決定,各自負責發送具體類型的通知。
如何定義與使用抽象類別?
在 TypeScript 中,我們使用 abstract 關鍵字來定義抽象類別與方法。以下是定義抽象類別與抽象方法的基本語法:
定義抽象類別
員工 Employee 是抽象類別,定義了所有員工共有的行為(如顯示員工資訊的 showInfo() 方法),以及一個抽象的 calculateSalary() 方法。
// 定義抽象類別 Employee
abstract class Employee {
constructor(public name: string) {}
// 抽象方法:每種員工都有不同的薪資計算方式
abstract calculateSalary(): number
// 具體方法:顯示員工資訊
showInfo(): void {
console.log(`員工:${this.name}`)
}
}
// new Employee('阿毛'); // Error: 無法建立抽象類別的執行個體。定義子類
全職員工 FullTimeEmployee 實作了薪資固定的計算方式, 兼職員工 PartTimeEmployee 根據時薪和工時計算薪資。
class FullTimeEmployee extends Employee {
constructor(name: string, private salary: number) {
super(name)
}
// 實作薪資計算方法,固定薪資
calculateSalary(): number {
return this.salary
}
}
class PartTimeEmployee extends Employee {
constructor(
name: string,
private hourlyRate: number,
private hoursWorked: number,
) {
super(name)
}
// 實作薪資計算方法,按時薪計算
calculateSalary(): number {
return this.hourlyRate * this.hoursWorked
}
}創建定義好的子類
每種員工類型都有自己特定的薪資計算邏輯,但可以共用 showInfo() 這樣的通用方法。
const mao = new FullTimeEmployee('阿毛', 81000)
mao.showInfo() // 員工:阿毛
console.log(mao.calculateSalary()) // 81000
const jason = new PartTimeEmployee('傑森', 200, 240)
jason.showInfo() // 員工:傑森
console.log(jason.calculateSalary()) // 48000抽象類別的具體實用性
抽象類別的存在解決了程式設計中許多重複性工作。當多個類別需要共用相同邏輯或結構時,抽象類別能夠為它們提供一個統一的藍圖,讓子類共享通用方法的同時,保留各自的特殊實作。這種方式可以大大提高程式碼的可讀性和可維護性。
參考文獻
Related Posts
TypeScript 後記
終於完成連續三十天的鐵人賽文章撰寫!距離我第一次參加鐵人賽已經三年之久了。這次參加主要是因為朋友邀請一起參賽,同時我自己也想藉此機會深入了解 TypeScript 5 的新功能,強迫自己透過寫作來吸收知識。
TypeScript 實戰:製作 npm Package
在開發專案時,經常會遇到跨專案共用邏輯或工具的情況,例如常用的 logger 或驗證工具。如果每次都從一個專案複製貼上到另一個專案,難免會出現版本不同步或維護困難的問題。為了解決這類問題,我們可以將這些共用邏輯獨立成為 npm 套件,以便在多個專案中重複使用。
TypeScript 實戰:前端表單與串接 API
在現代前端開發中,與後端進行資料交換是常見的需求。透過 HTTP 請求,我們可以將資料送出並取得結果。這篇文章將介紹如何使用 TypeScript 實作前端表單與串接 API,並展示如何將這些功能結合到 React 應用中。同時,文章還會介紹如何解決跨域問題(CORS),以便讓前後端能順利溝通。
Johnson Mao
A passionate software engineer and blogger sharing thoughts on technology, AI, and development.