Dart中如何查找实现泛型抽象类IBaseClass<T>的所有类?
问题
我定义了一个泛型抽象类 IBaseClass<T>,代码如下(修正了原代码的语法问题):
abstract class IBaseClass<T> { void handle(T command); }
目前已有两个类实现了这个泛型类:
class CreateHandler implements IBaseClass<CreateCommand> { void handle(CreateCommand command) { // 执行逻辑 } } class DeleteHandler implements IBaseClass<DeleteCommand> { void handle(DeleteCommand command) { // 执行逻辑 } }
请问在Dart中是否存在类似这样的方法:传入基类后返回所有实现它的类,比如调用 var implementations = GetImplementationsForClass(TypeOf(IBaseClass<>));?
回答
Dart 本身没有内置的 API可以直接获取某个泛型抽象类的所有实现类,原因在于 Dart 运行时存在类型擦除,且原生不提供类扫描的机制。
你可以通过以下几种方案实现类似需求:
手动注册机制
维护一个全局注册表,让每个实现类在定义后主动注册进去。示例代码:// 全局注册表,键为基类类型,值为实现类类型列表 final Map<Type, List<Type>> handlerRegistry = {}; // 注册方法 void registerHandler<Base, Impl>() { handlerRegistry[Base] ??= []; handlerRegistry[Base]!.add(Impl); } // 使用示例 void main() { // 注册实现类 registerHandler<IBaseClass<dynamic>, CreateHandler>(); registerHandler<IBaseClass<dynamic>, DeleteHandler>(); // 获取所有实现类 var implementations = handlerRegistry[IBaseClass<dynamic>]; }这种方式简单直接,没有额外依赖,适合小型项目或对性能敏感的场景。
代码生成工具
借助source_gen、build_runner这类编译期代码生成工具,自动扫描项目中实现IBaseClass<T>的类,并生成对应的注册表代码。这种方式无需手动维护注册逻辑,适合大型项目,能减少重复劳动。反射(dart:mirrors)
Dart 的dart:mirrors库提供了反射能力,可以扫描已加载的库中的类,判断是否实现了目标泛型类。但需要注意:- Flutter 环境禁用了
dart:mirrors,无法在Flutter项目中使用; - 反射会带来明显的性能开销,且由于类型擦除,判断泛型参数的匹配会比较复杂,需要额外处理类型信息。
- Flutter 环境禁用了
内容的提问来源于stack exchange,提问作者Jafar ashrafi
相关产品推荐
相关产品推荐

