面试题答案
一键面试运用TypeScript抽象类构建通用基础架构
- 用户权限管理
- 定义一个抽象类
BasePermission
,其中包含抽象方法checkPermission
,不同的权限检查逻辑可以通过继承这个抽象类来实现。
// 抽象类定义 abstract class BasePermission { abstract checkPermission(): boolean; } // 具体的权限实现类 class AdminPermission extends BasePermission { checkPermission(): boolean { // 管理员权限检查逻辑 return true; } } class UserPermission extends BasePermission { checkPermission(): boolean { // 普通用户权限检查逻辑 return false; } }
- 定义一个抽象类
- 模块加载
- 创建抽象类
BaseModuleLoader
,包含抽象方法loadModule
。这样不同类型的模块加载方式(如异步加载、同步加载)可以通过继承来实现。
abstract class BaseModuleLoader { abstract loadModule(moduleName: string): Promise<any>; } class AsyncModuleLoader extends BaseModuleLoader { async loadModule(moduleName: string): Promise<any> { // 异步加载模块逻辑 return import(`./${moduleName}`); } }
- 创建抽象类
- 数据缓存
- 定义
BaseDataCache
抽象类,包含setCache
和getCache
抽象方法。不同的数据缓存策略(如内存缓存、本地存储缓存)可通过继承实现。
abstract class BaseDataCache { abstract setCache(key: string, value: any): void; abstract getCache(key: string): any; } class MemoryDataCache extends BaseDataCache { private cache: { [key: string]: any } = {}; setCache(key: string, value: any): void { this.cache[key] = value; } getCache(key: string): any { return this.cache[key]; } }
- 定义
- 实现低耦合、高内聚
- 通过抽象类,各个功能模块的具体实现与其他模块解耦。例如,权限管理模块不需要关心模块加载和数据缓存的具体实现。同时,每个抽象类及其子类专注于自身的功能,实现了高内聚。比如
BasePermission
及其子类只负责权限相关的操作。
- 通过抽象类,各个功能模块的具体实现与其他模块解耦。例如,权限管理模块不需要关心模块加载和数据缓存的具体实现。同时,每个抽象类及其子类专注于自身的功能,实现了高内聚。比如
使用抽象类可能遇到的陷阱及规避方法
- 陷阱:过度抽象
- 问题描述:定义过多不必要的抽象类,导致代码结构复杂,难以理解和维护。
- 规避方法:在设计抽象类时,要基于实际需求,确保每个抽象类都有明确的存在意义。可以通过对业务场景的详细分析,只抽取那些真正具有共性且需要不同实现的部分为抽象类。
- 陷阱:抽象类继承层次过深
- 问题描述:继承层次过深会使代码的可读性和可维护性变差,同时增加查找和理解代码逻辑的难度。
- 规避方法:尽量控制继承层次,一般不超过三层。如果发现继承层次可能过深,可以考虑使用组合(composition)来代替继承,将功能拆分成更小的组件进行组合,而不是过度依赖继承关系。
- 陷阱:抽象类与具体实现类之间的强依赖
- 问题描述:如果抽象类依赖于具体实现类的细节,当具体实现类发生变化时,抽象类也需要修改,破坏了低耦合原则。
- 规避方法:在抽象类中只定义通用的接口和抽象方法,避免在抽象类中使用具体实现类特有的属性或方法。确保抽象类的设计是基于通用的、稳定的需求,而不是特定实现的细节。