如何在Dart的多个Enum中复用字段与方法实现?
Dart枚举复用相同字段与方法的实现方案
问题背景
需要创建多个拥有相同字段(name)和关联方法(concat)的枚举,示例原始代码如下:
enum Enum1 { A1('A1', 1), B1('B1', 2); String name; int x1; Enum1(this.name, this.x1); String concat(String s) { return name + s; } } enum Enum2 { A2('A2', 3), B2('B2', 4); String name; int x2; Enum2(this.name, this.x2); String concat(String s) { return name + s; } }
目标是复用name字段和concat方法的代码,避免在每个枚举中重复实现。此前尝试用普通类作为接口,但系统要求每个枚举必须重新实现concat方法和name的getter,尝试代码如下:
class Reuse { String name; String concat(String s) { return name + s; } } enum Enum1 implements Reuse { A1('A1',1), B1('B1',2); int x1; String name; Enum1(this.name, this.x1); String concat(String s); } enum Enum2 implements Reuse { A2('A2',3), B2('B2',4); int x2; String name; Enum2(this.name, this.x2); String concat(String s); }
解决方案
方法一:使用抽象类+默认方法(推荐,类型安全)
Dart中枚举无法继承类,但可以实现抽象类。我们可以把公共的字段定义和方法逻辑放在抽象类中,利用抽象类的默认方法实现代码复用:
- 定义抽象类,声明
name的getter并实现concat方法:
abstract class HasName { String get name; String concat(String s) { return name + s; } }
- 枚举实现该抽象类,仅需在枚举内部声明
name字段(Dart会自动生成getter),无需重复实现concat方法:
enum Enum1 implements HasName { A1('A1', 1), B1('B1', 2); @override final String name; final int x1; Enum1(this.name, this.x1); } enum Enum2 implements HasName { A2('A2', 3), B2('B2', 4); @override final String name; final int x2; Enum2(this.name, this.x2); }
方法二:使用扩展(Extension)
如果不想依赖抽象类,也可以通过扩展为所有枚举添加公共方法,但这种方式依赖动态类型,类型安全性稍弱:
extension ConcatExtension on Enum { // 动态获取name字段 String get name => (this as dynamic).name; String concat(String s) { return name + s; } } // 枚举无需额外实现,直接使用扩展方法 enum Enum1 { A1('A1', 1), B1('B1', 2); final String name; final int x1; Enum1(this.name, this.x1); } enum Enum2 { A2('A2', 3), B2('B2', 4); final String name; final int x2; Enum2(this.name, this.x2); }
原尝试失败原因
- 普通类无法作为接口提供默认方法实现,枚举实现普通类时,必须显式重写所有非静态方法和字段的getter/setter;
- 代码中仅声明了
concat(String s);但未实现,导致编译器报错要求补全实现。
内容的提问来源于stack exchange,提问作者Egamad
相关产品推荐
相关产品推荐

