如何在Dart中指定变量为任意枚举类型而非Enum本身?
问题描述
定义了如下抽象类Concept:
abstract class Concept { late Enum option; String get name => option.name; }
尝试用以下代码实现子类:
enum FeeOption { fast, standard, slow, } class FastFeeRate extends Concept { FeeOption option = FeeOption.fast; } print(FastFeeRate().name); // 期望输出 'fast'
但运行时触发错误:
FastFeeRate.option=' ('void Function(FeeOption)') isn't a valid override of 'Concept.option=' ('void Function(Enum)').
请问如何让抽象类中的option变量支持任意枚举类型,而非只能用Enum本身?
解决方案
这个错误是因为Dart的类型覆盖规则:父类里option的setter接受所有Enum类型参数,子类却把它限定成了具体的FeeOption类型——相当于缩小了参数的可接受范围,违反了里氏替换原则,所以编译器不允许这么做。
正确的处理方式是给抽象类加上泛型约束,让它能适配任意具体的枚举类型:
// 泛型T必须是Enum的子类 abstract class Concept<T extends Enum> { late T option; String get name => option.name; } enum FeeOption { fast, standard, slow, } // 子类指定具体的枚举类型FeeOption class FastFeeRate extends Concept<FeeOption> { @override FeeOption option = FeeOption.fast; } void main() { print(FastFeeRate().name); // 输出 'fast' }
这么做的优势:
- 抽象类可以复用在任何枚举场景,比如后续新增
OtherOption枚举,直接写class OtherConcept extends Concept<OtherOption>就行 - 类型安全,编译器会校验子类的
option是否属于指定枚举,避免类型错误 - 保留了
name属性的逻辑复用,不用在每个子类重复写
如果不需要单独定义子类,还能直接用泛型实例化简化代码:
final fastFeeRate = Concept<FeeOption>()..option = FeeOption.fast; print(fastFeeRate.name); // 输出 'fast'
内容的提问来源于stack exchange,提问作者MetaStack
相关产品推荐
相关产品推荐

