面试题答案
一键面试抽象方法和具体方法的不同
- 定义
- 抽象方法:只声明方法签名,没有具体实现,以
abstract
关键字修饰。例如:abstract someAbstractMethod(): void;
它存在的意义是为子类提供一个统一的方法定义规范,子类必须实现这些抽象方法。 - 具体方法:有完整的方法体实现,和普通类中的方法类似。例如:
concreteMethod() { console.log('This is a concrete method'); }
子类可以直接继承并使用具体方法,也可以根据需要重写它。
- 抽象方法:只声明方法签名,没有具体实现,以
- 在抽象类中的特性
- 抽象方法:抽象类中可以包含抽象方法,但包含抽象方法的类必须声明为抽象类。抽象方法迫使继承该抽象类的子类必须实现该方法,以确保子类具有特定的行为。
- 具体方法:抽象类中的具体方法为子类提供了可复用的通用功能实现,子类无需重新实现这些方法,除非有特殊需求需要重写。
适用场景举例
- 抽象方法适用场景
- 图形绘制系统:假设有一个抽象类
Shape
,它有抽象方法draw
。不同的图形类如Circle
、Rectangle
继承自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
抽象方法由子类根据自身需求(如发送到文件还是控制台等)来实现不同的日志发送逻辑。