Dart中如何实现枚举扩展以避免错误类型代码重复?
在Dart中避免错误枚举重复的解决方案
Dart的枚举不支持继承,所以没法直接实现你想要的extends写法,不过可以通过以下几种方式解决代码重复问题:
方案一:用类+常量替代枚举(兼容所有Dart版本)
把基础错误定义成包含常量的类,让扩展错误类继承它,同时复用基础错误的常量:
// 基础错误类 class WifiBaseErrors { final String name; const WifiBaseErrors(this.name); static const wifiNotFound = WifiBaseErrors('wifiNotFound'); static const permissionMissing = WifiBaseErrors('permissionMissing'); static const wifiTurnedOff = WifiBaseErrors('wifiTurnedOff'); } // 扩展的PIN连接错误类 class WifiPinCodeConnectionErrors extends WifiBaseErrors { const WifiPinCodeConnectionErrors(super.name); // 新增的错误类型 static const wrongPin = WifiPinCodeConnectionErrors('wrongPin'); static const pinTooShort = WifiPinCodeConnectionErrors('pinTooShort'); // 复用基础错误常量,方便直接通过该类访问 static const WifiBaseErrors wifiNotFound = WifiBaseErrors.wifiNotFound; static const WifiBaseErrors permissionMissing = WifiBaseErrors.permissionMissing; static const WifiBaseErrors wifiTurnedOff = WifiBaseErrors.wifiTurnedOff; }
用法和枚举一致,直接通过WifiPinCodeConnectionErrors.wifiNotFound这类方式调用,同时实现了代码复用。
方案二:使用联合类型(Dart 3.0+)
如果你的项目使用Dart 3.0及以上版本,可以利用联合类型将基础枚举和新增错误枚举合并:
enum WifiBaseErrors { wifiNotFound, permissionMissing, wifiTurnedOff } // 定义新增的错误枚举 enum WifiPinCodeExtraErrors { wrongPin, pinTooShort } // 联合类型,涵盖基础错误和新增错误 typedef WifiPinCodeConnectionErrors = WifiBaseErrors | WifiPinCodeExtraErrors; // 函数返回联合类型 WifiPinCodeConnectionErrors connectToDeviceUsingPin() { // 根据业务逻辑返回任意一种错误 return WifiBaseErrors.wifiNotFound; // 或者 return WifiPinCodeExtraErrors.wrongPin; }
这种方式完全不需要重复定义枚举值,类型安全且代码最简洁,是Dart3+的最优解。
方案三:枚举+扩展方法(适合必须用枚举的场景)
如果业务要求必须使用枚举,可以通过扩展方法减少转换代码,虽然还是要重复定义枚举值,但能避免后续逻辑里的重复:
enum WifiBaseErrors { wifiNotFound, permissionMissing, wifiTurnedOff } enum WifiPinCodeConnectionErrors { wifiNotFound, permissionMissing, wifiTurnedOff, wrongPin, pinTooShort } // 扩展方法:将基础错误转换为PIN连接错误 extension WifiBaseErrorsToPinError on WifiBaseErrors { WifiPinCodeConnectionErrors toPinConnectionError() { switch (this) { case WifiBaseErrors.wifiNotFound: return WifiPinCodeConnectionErrors.wifiNotFound; case WifiBaseErrors.permissionMissing: return WifiPinCodeConnectionErrors.permissionMissing; case WifiBaseErrors.wifiTurnedOff: return WifiPinCodeConnectionErrors.wifiTurnedOff; } } }
当需要把WifiBaseErrors类型的错误转换成WifiPinCodeConnectionErrors时,直接调用.toPinConnectionError()即可。
内容的提问来源于stack exchange,提问作者Ensei Tankado
相关产品推荐
相关产品推荐

