MST

星途 面试题库

面试题:TypeScript中抽象类和接口在继承与实现方面的区别

请阐述在TypeScript里,抽象类的继承和接口的实现分别有哪些特点和规则?并举例说明一个类继承抽象类和实现接口时的代码结构差异。
32.8万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

抽象类的继承特点和规则

  1. 抽象类不能被实例化:抽象类主要为子类提供一个通用的基类,自身不能被直接创建实例。
  2. 抽象方法必须在子类中实现:抽象类中可以包含抽象方法(没有方法体的方法),子类继承抽象类时必须实现这些抽象方法,否则子类也必须声明为抽象类。
  3. 子类可重写抽象类的非抽象方法:抽象类中的非抽象方法,子类可以选择重写以满足自身需求。

接口的实现特点和规则

  1. 类可以实现多个接口:与继承抽象类不同,一个类可以同时实现多个接口,这使得类具有更灵活的功能组合。
  2. 实现接口的类必须实现接口中的所有成员:接口定义了一组成员(属性、方法等),实现接口的类必须确保提供这些成员的具体实现。
  3. 接口只定义契约,不包含实现:接口只规定了类应该具有哪些成员,而不关心这些成员如何实现。

代码结构差异示例

// 抽象类定义
abstract class Animal {
    constructor(public name: string) {}
    abstract speak(): void;
    move(): void {
        console.log(`${this.name} is moving.`);
    }
}

// 继承抽象类
class Dog extends Animal {
    speak(): void {
        console.log(`${this.name} barks.`);
    }
}

// 接口定义
interface Flyable {
    fly(): void;
}

// 实现接口
class Bird implements Flyable {
    constructor(public name: string) {}
    fly(): void {
        console.log(`${this.name} is flying.`);
    }
}

// 类继承抽象类并实现接口
class Pegasus extends Animal implements Flyable {
    constructor(name: string) {
        super(name);
    }
    speak(): void {
        console.log(`${this.name} neighs.`);
    }
    fly(): void {
        console.log(`${this.name} is flying gracefully.`);
    }
}

在上述代码中,Dog 类继承自 Animal 抽象类,必须实现 Animal 中的抽象方法 speak。而 Bird 类实现 Flyable 接口,必须实现 fly 方法。Pegasus 类既继承了 Animal 抽象类,又实现了 Flyable 接口,需要同时实现抽象类中的抽象方法和接口中的方法。从代码结构上能清晰看出继承抽象类和实现接口的不同之处,继承抽象类是一种 “is - a” 的关系(如 Dog 是一种 Animal),而实现接口更强调 “can - do” 的能力(如 Birdfly)。