当前位置: 首页 > 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.xdnf.cn/news/793117.html

相关文章:

  • HTML5新特性
  • DAY 20 奇异值SVD分解
  • ant-design-vue select 下拉框不好用解决
  • Nginx 的配置文件
  • GCC内存占用统计使用指南
  • 【Android】双指旋转手势
  • AI 驱动工业:应用场景、挑战与未来趋势
  • SP网络结构:现代密码学的核心设计
  • SAP是什么?SAP概述
  • 免费论文查重与AI检测工具推荐
  • NVIDIA NVLink Fusion 是 PCIe Gen5 的 14 倍
  • pcie 日常问答-20250528
  • 累乘法求数列的通项公式
  • 手撕HashMap!(JDK7版本)
  • Unreal Niagara制作炫酷VJ粒子
  • 深入解析域名解析:原理、流程与应用实践
  • Spring 中创建 Bean 有几种方式?
  • Ajax技术深度解析:从原理到现代Web开发实践
  • 学习日记-day21-6.3
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(31):そう
  • 碰一碰发视频-源码系统开发技术分享
  • javascript 实战案例 二级联动下拉选框
  • 八.MySQL复合查询
  • 书籍在其他数都出现k次的数组中找到只出现一次的数(7)0603
  • 实战商品订单秒杀设计实现
  • Juce实现Table自定义
  • 高效背诵英语四级范文
  • JS逆向-基础入门案例(详细步骤)
  • 39、响应处理-【源码分析】-内容协商原理
  • Ubuntu20.04用root(管理员身份)启动vscode