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 字段)→ 抽象类;只定义契约、希望一个类能实现多份 → 接口。常见组合:接口定义对外契约,抽象类提供默认实现。
Web-Tutorial.com

Web-Tutorial 技术团队

由多位开发者共同维护的编程教程平台。每篇教程由对应领域的开发者编写和审核,确保内容准确可靠。如发现任何问题,欢迎向我们反馈。

100%

🙏 帮我们做得更好

我们是刚上线的编程教程站,几个人的小团队,精力有限。页面虽经检查,难免还有疏漏——链接失效、排版错乱、内容有误、语言生硬……

如果您发现了,麻烦告诉我们,我们会在收到反馈后第一时间进行修复,再次感谢您的光临 🙏