🎯 学习目标

  • 理解抽象类的概念和作用
  • 掌握抽象方法和抽象属性的定义
  • 学会正确继承抽象类
  • 了解抽象类与接口的区别

📝 抽象类定义

// 抽象类:不能被实例化 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); } }

📝 本节小结

  • • abstract 定义抽象类和抽象方法
  • • 抽象类不能直接实例化
  • • 子类必须实现所有抽象成员
  • • 抽象类可包含具体实现