介绍
TypeScript 中支持抽象类(Abstract Class),它是一种不能直接实例化的类,主要用于定义其他类的共同接口和基础行为,同时强制子类实现特定方法。
特点
- 用
abstract关键字声明 - 可以包含抽象方法(无实现体)和具体方法(有实现)
- 不能直接实例化,只能被继承
- 子类必须实现抽象类中所有的抽象方法,否则子类也需声明为抽象类
抽象类与接口的区别
- 抽象类可以包含具体方法实现,接口只能定义方法签名
- 类只能继承一个抽象类,但可以实现多个接口
- 抽象类更适合表示”是一个”的关系(继承),接口更适合表示”有能力”的关系(实现)
用法
基本用法
// 定义抽象类
abstract class Animal {
// 抽象方法(必须由子类实现)
abstract makeSound(): void;
// 具体方法(提供默认实现)
move(): void {
console.log("动物在移动");
}
}
// 继承抽象类并实现抽象方法
class Dog extends Animal {
// 必须实现抽象方法
makeSound(): void {
console.log("汪汪叫");
}
// 可以重写父类的具体方法
move(): void {
console.log("狗在跑");
}
}
// 实例化子类
const dog = new Dog();
dog.makeSound(); // 输出: "汪汪叫"
dog.move(); // 输出: "狗在跑"
// 错误:不能实例化抽象类
// const animal = new Animal(); // 编译错误
带属性的抽象类示例
abstract class Vehicle {
protected brand: string;
constructor(brand: string) {
this.brand = brand;
}
abstract start(): void;
getBrand(): string {
return this.brand;
}
}
class Car extends Vehicle {
start(): void {
console.log(`${this.brand}汽车启动了`);
}
}
const myCar = new Car("特斯拉");
myCar.start(); // 输出: "特斯拉汽车启动了"
console.log(myCar.getBrand()); // 输出: "特斯拉"
抽象类在 TypeScript 中常用于定义类层次结构的基础,提供代码复用的同时,确保子类遵循特定的接口规范。