当前位置: 首页 > news >正文

TypeScript中class的两种继承方式extends和implements的对比

在 TypeScript 中,extends 和 implements 是实现类继承的两种核心方式,它们的用途和语法差异如下:

一、核心区别

特性extends(类继承)implements(接口实现)
继承对象继承另一个的属性和方法(包括实现)。实现一个或多个接口,仅约束方法签名(不包含实现)。
语法class Child extends Parent { ... }class MyClass implements Interface1, Interface2 { ... }
继承数量只能单继承(extends 后面只能跟一个类)。可以多实现(implements 后面跟多个接口,用逗号分隔)。
构造函数子类构造函数必须调用 super() 以初始化父类。无特殊要求,只需实现接口中定义的成员。
用途复用父类的代码和行为,扩展已有类。确保类符合特定契约(接口),实现多态。

二、extends(类继承)的使用

1. 基本语法
class Animal {constructor(public name: string) {}speak() {console.log(`${this.name} makes a sound.`);}
}class Dog extends Animal {constructor(name: string, public breed: string) {super(name); // 必须调用父类构造函数}speak() {console.log(`${this.name} barks!`); // 方法重写}
}const dog = new Dog("Buddy", "Labrador");
dog.speak(); // 输出: "Buddy barks!"
2. 关键点
  • 单继承:每个类只能有一个直接父类。
  • 访问修饰符:子类可访问父类的 public 和 protected 成员,但不能访问 private 成员。
  • 方法重写:子类可通过同名方法覆盖父类的实现。

三、implements(接口实现)的使用

1. 基本语法
interface Shape {area(): number;
}interface Printable {printInfo(): void;
}class Circle implements Shape, Printable {constructor(public radius: number) {}area() {return Math.PI * this.radius ** 2; // 实现 Shape 接口的方法}printInfo() {console.log(`Circle with radius ${this.radius}`); // 实现 Printable 接口的方法}
}
2. 关键点
  • 多实现:一个类可以实现多个接口,用逗号分隔。
  • 严格匹配:类必须实现接口中定义的所有成员(方法和属性),且类型必须兼容。
  • 接口扩展:接口可继承其他接口,类需实现所有层级的成员。

四、对比示例

1. extends 的场景
class Vehicle {start() {console.log("Starting engine...");}
}class Car extends Vehicle {// 继承了 Vehicle 的 start() 方法drive() {this.start(); // 复用父类方法console.log("Driving...");}
}
2. implements 的场景
interface Logger {log(message: string): void;
}class ConsoleLogger implements Logger {log(message: string) {console.log(`[LOG] ${message}`); // 实现接口方法}
}class FileLogger implements Logger {log(message: string) {// 将消息写入文件的实现}
}

五、常见误区与注意事项

1. 不要混淆继承和实现
  • extends:用于复用代码和行为,子类是父类的 “特殊化”(如 Dog 是 Animal 的一种)。
  • implements:用于约束类的结构,实现类和接口是 “契约” 关系(如 Circle 承诺实现 Shape 接口)。
2. 接口 vs 抽象类
  • 接口(Interface):只能定义方法签名,不能包含实现,支持多实现。
  • 抽象类(Abstract Class):可包含抽象方法(必须由子类实现)和具体实现,只能单继承。
    abstract class Animal {abstract speak(): void; // 抽象方法,必须由子类实现move() {console.log("Moving..."); // 具体方法,子类可直接继承}
    }
    
3. 接口可以继承类

接口可继承类的结构(包括私有和受保护成员),但只有该类的子类才能实现这个接口:

class Base {private x = 0;
}interface Derived extends Base {y: number;
}class Child extends Base implements Derived {y = 1; // 合法,Child 是 Base 的子类
}

六、何时选择 extends 或 implements

场景推荐方式原因
复用已有类的代码和行为extends子类自动获得父类的所有属性和方法,只需扩展需要的部分。
定义类的契约(如插件系统)implements多个类可实现同一接口,确保方法签名统一,便于替换和扩展。
需要部分实现 + 部分抽象抽象类(abstract class结合了 extends 和抽象方法,强制子类实现特定部分,同时复用已有代码。
需要多继承特性implements类无法多继承,但可实现多个接口,间接实现 “多继承” 的效果。

总结

  • extends纵向扩展,让子类继承父类的属性和方法,强调 “是一种”(is-a)关系。
  • implements横向约束,让类遵循接口的契约,强调 “能做什么”(can-do)关系。

合理结合 extends 和 implements,可构建出既复用代码又灵活可扩展的类型系统。

http://www.lqws.cn/news/87337.html

相关文章:

  • Hadoop 3.x 伪分布式 8088端口无法访问问题处理
  • 【Java实用工具类】手撸SqlBuilder工具类,优雅拼接动态SQL,MyBatisPlus同款风格!
  • 记一次sql按经纬度计算距离
  • 立志成为一名优秀测试开发工程师(第十一天)—Postman动态参数/变量、文件上传、断言策略、批量执行及CSV/JSON数据驱动测试
  • K8s基础一
  • k8s更新证书
  • 【信创-k8s】海光/兆芯+银河麒麟V10离线部署k8s1.31.8+kubesphere4.1.3
  • 03.搭建K8S集群
  • IPython 使用技巧整理
  • Impromptu VLA:用于驾驶视觉-语言-动作模型的开放权重和开放数据
  • 基于wifi的室内定位算法设计与实现
  • 25年宁德时代新能源科技SHL 测评语言理解数字推理Verify题库
  • 操作系统:生态思政
  • Java基础(二):八种基本数据类型详解
  • [蓝桥杯]路径之谜
  • 从 iPhone 备份照片: 保存iPhone图片的5种方法
  • 【Pandas】pandas DataFrame rename_axis
  • vue-15 (实践练习:使用路由防护实现身份验证和授权)
  • MTK的Download agent是什么下载程序?
  • 【开源工具】Python+PyQt5打造智能桌面单词记忆工具:悬浮窗+热键切换+自定义词库
  • 【开源工具】超全Emoji工具箱开发实战:Python+PyQt5打造跨平台表情管理神器
  • 【C++高并发内存池篇】性能卷王养成记:C++ 定长内存池,让内存分配快到飞起!
  • 第三章 3.MAC Address(CCNA)
  • Redis 缓存粒度如何控制?缓存整个对象还是部分字段?
  • 写读后感的时候,可以适当地引用书中的内容吗?
  • C++智能指针的知识!
  • 2048小游戏C++板来啦!
  • 第一篇:揭示模型上下文协议(MCP):AI的通用连接器
  • JavaSE:面向对象进阶之内部类(Inner Class)
  • STM32 智能小车项目 L298N 电机驱动模块