抽象類別(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
抽象類別的存在解決了程式設計中許多重複性工作。當多個類別需要共用相同邏輯或結構時,抽象類別能夠為它們提供一個統一的藍圖,讓子類共享通用方法的同時,保留各自的特殊實作。這種方式可以大大提高程式碼的可讀性和可維護性。