MST

星途 面试题库

面试题:TypeScript 抽象类中抽象方法和具体方法的区别及应用场景

请阐述在 TypeScript 中抽象类里抽象方法和具体方法有何不同,并且分别举例说明它们适用的场景。
22.4万 热度难度
前端开发TypeScript

知识考点

AI 面试

面试题答案

一键面试

抽象方法和具体方法的不同

  1. 定义
    • 抽象方法:只声明方法签名,没有具体实现,以 abstract 关键字修饰。例如:abstract someAbstractMethod(): void; 它存在的意义是为子类提供一个统一的方法定义规范,子类必须实现这些抽象方法。
    • 具体方法:有完整的方法体实现,和普通类中的方法类似。例如:concreteMethod() { console.log('This is a concrete method'); } 子类可以直接继承并使用具体方法,也可以根据需要重写它。
  2. 在抽象类中的特性
    • 抽象方法:抽象类中可以包含抽象方法,但包含抽象方法的类必须声明为抽象类。抽象方法迫使继承该抽象类的子类必须实现该方法,以确保子类具有特定的行为。
    • 具体方法:抽象类中的具体方法为子类提供了可复用的通用功能实现,子类无需重新实现这些方法,除非有特殊需求需要重写。

适用场景举例

  1. 抽象方法适用场景
    • 图形绘制系统:假设有一个抽象类 Shape,它有抽象方法 draw。不同的图形类如 CircleRectangle 继承自 Shape 并实现 draw 方法。
abstract class Shape {
    abstract draw(): void;
}

class Circle extends Shape {
    draw() {
        console.log('Drawing a circle');
    }
}

class Rectangle extends Shape {
    draw() {
        console.log('Drawing a rectangle');
    }
}

这里 draw 方法在不同的图形子类中有不同的实现逻辑,通过抽象方法强制子类实现特定的绘制行为。 2. 具体方法适用场景

  • 日志记录类:假设有一个抽象类 Logger,其中有一个具体方法 logMessage 用于格式化日志消息,同时有抽象方法 sendLog 用于不同方式的日志发送。
abstract class Logger {
    logMessage(message: string) {
        const formattedMessage = `[${new Date().toISOString()}] ${message}`;
        console.log(formattedMessage);
        this.sendLog(formattedMessage);
    }
    abstract sendLog(message: string): void;
}

class ConsoleLogger extends Logger {
    sendLog(message: string) {
        console.log('Sending log to console:', message);
    }
}

class FileLogger extends Logger {
    sendLog(message: string) {
        console.log('Sending log to file:', message);
    }
}

logMessage 方法为所有子类提供了通用的日志格式化和记录到控制台的功能,而 sendLog 抽象方法由子类根据自身需求(如发送到文件还是控制台等)来实现不同的日志发送逻辑。