abstract class 抽象类
最后更新:2026-10-22
abstract class 抽象类
抽象类(abstract class)是"半成品基类":可以包含实现,也可以只声明抽象成员(abstract area(): number)让子类必须补齐。它不能被直接实例化,只能被 extends——适合表达"所有子类共享骨架,细节各自实现"。
| 分组 | 函数与类 |
|---|---|
| 类型 | 语法 |
| 严格模式 | 不需要 |
ℹ️ 说明 编辑器将 TypeScript 转译为 JavaScript 后运行(不做类型检查);类型检查结果见示例 Output。
📝 语法
abstract class Shape {
constructor(protected name: string) {}
abstract area(): number; // 抽象方法:只有签名
describe(): string { // 具体方法:子类直接继承
return `${this.name}: ${this.area().toFixed(2)}`;
}
}
class Circle extends Shape {
constructor(private radius: number) { super("circle"); }
area(): number { return Math.PI * this.radius ** 2; }
}
⚙️ 参数
| abstract class | 抽象类:不能 new,只能被继承 |
|---|---|
| abstract area(): number | 抽象成员:只有签名没有实现,子类必须实现,否则编译报错 |
| protected | 常与抽象类搭配:name 这类"给子类用"的状态 |
返回值:抽象方法只写签名;具体方法正常标注返回类型。抽象类实例不存在,运行中的对象都是子类实例。
▶ 示例
修改下面的代码,点击试一试查看转译运行结果:
输出:
circle: 3.14
square: 4.00
(转译后运行输出;new Shape("x") 会得到编译错误 TS2511——尽管转译后的 JS 里它其实是个普通类)
💡 要点
ℹ️ 说明 抽象性也是编译期的:tsc 禁止 new Shape(),但转译后的 JS 是普通类,运行时 new 不会失败——这是"防呆"而不是"防拆"。
💡 提示 抽象类 vs 接口:抽象类能携带状态与实现(模板方法模式的核心);接口只描述形状。要共享代码用抽象类,只约束形状用接口,两者可以同时用。
⚠️ 注意 抽象类只能单继承(extends 一个类);需要"多份能力"时用接口 + 组合,不要硬凑继承链。
🏷️ 相关函数与类
💡 相关案例
更多案例即将上线。
📚 相关教程
❓ 常见问题
Q new 抽象类会怎样?
A 编译期报错 TS2511(不能创建抽象类实例)。转译后的 JS 里它就是普通类,运行时 new 不报错——所以别依赖运行时保护。
Q 抽象类可以有构造函数吗?
A 可以,且常与 protected 搭配:protected 修饰的构造函数同样禁止外部 new(但允许子类 super 调用),是"禁止直接实例化"的另一种表达。
Q 抽象类和接口该选哪个?
A 要共享实现/状态(describe 方法、name 字段)→ 抽象类;只定义契约、希望一个类能实现多份 → 接口。常见组合:接口定义对外契约,抽象类提供默认实现。