- • abstract 定义抽象类和抽象方法
- • 抽象类不能直接实例化
- • 子类必须实现所有抽象成员
- • 抽象类可包含具体实现
5.7 抽象类
定义基类的模板
🎯 学习目标
- 理解抽象类的概念和作用
- 掌握抽象方法和抽象属性的定义
- 学会正确继承抽象类
- 了解抽象类与接口的区别
📝 抽象类定义
// 抽象类:不能被实例化
abstract class Animal {
// 抽象属性:子类必须实现
abstract sound: string;
// 普通属性
name: string;
constructor(name: string) {
this.name = name;
}
// 抽象方法:子类必须实现
abstract speak(): void;
// 具体方法:子类继承
move(): void {
console.log(`${this.name} moves`);
}
}
// const animal = new Animal('Generic'); // Error: 抽象类不能实例化
class Dog extends Animal {
// 实现抽象属性
sound: string = 'Woof';
// 实现抽象方法
speak(): void {
console.log(`${this.name} says ${this.sound}`);
}
}
const dog = new Dog('Buddy');
dog.speak(); // "Buddy says Woof"
dog.move(); // "Buddy moves"
📊 抽象类 vs 接口
| 特性 | 抽象类 | 接口 |
|---|---|---|
| 实例化 | 不能 | 不能 |
| 实现方法 | 可以 | 不能 |
| 多继承 | 不支持 | 支持 |
| 访问修饰符 | 支持 | 不支持 |
| 构造函数 | 支持 | 不支持 |
💻 实际应用
abstract class Repository<T> {
abstract findById(id: string): Promise<T | null>;
abstract findAll(): Promise<T[]>;
abstract save(entity: T): Promise<void>;
abstract delete(id: string): Promise<void>;
// 通用方法
async exists(id: string): Promise<boolean> {
const entity = await this.findById(id);
return entity !== null;
}
}
class UserRepository extends Repository<User> {
private users: Map<string, User> = new Map();
async findById(id: string): Promise<User | null> {
return this.users.get(id) || null;
}
async findAll(): Promise<User[]> {
return Array.from(this.users.values());
}
async save(user: User): Promise<void> {
this.users.set(user.id, user);
}
async delete(id: string): Promise<void> {
this.users.delete(id);
}
}
📝 本节小结
✅