接口 vs 抽象类
基本概念与区别
抽象类的特性
-
定义特点
- 不允许被实例化,只能被继承
- 可以包含属性和方法
- 方法可以有具体实现,也可以是抽象方法
- 子类必须实现所有抽象方法
-
代码示例
abstract class Logger {
private name: string;
private enabled: boolean;
private minPermittedLevel: Level;
constructor(name: string, enabled: boolean, minPermittedLevel: Level) {
this.name = name;
this.enabled = enabled;
this.minPermittedLevel = minPermittedLevel;
}
public log(level: Level, message: string): void {
const loggable = this.enabled && (this.minPermittedLevel <= level);
if (!loggable) return;
this.doLog(level, message);
}
protected abstract doLog(level: Level, message: string): void;
}
接口的特性
-
定义特点
- 不能包含属性(除了静态常量)
- 只能声明方法,方法不能包含实现代码
- 类必须实现接口中声明的所有方法
-
代码示例
interface Filter {
doFilter(req: RpcRequest): void;
}
class AuthenticationFilter implements Filter {
doFilter(req: RpcRequest): void {
// 鉴权逻辑实现
}
}