You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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中枚举无法继承类,但可以实现抽象类。我们可以把公共的字段定义和方法逻辑放在抽象类中,利用抽象类的默认方法实现代码复用:

  1. 定义抽象类,声明name的getter并实现concat方法:
abstract class HasName {
  String get name;

  String concat(String s) {
    return name + s;
  }
}
  1. 枚举实现该抽象类,仅需在枚举内部声明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);
}

原尝试失败原因

  1. 普通类无法作为接口提供默认方法实现,枚举实现普通类时,必须显式重写所有非静态方法和字段的getter/setter;
  2. 代码中仅声明了concat(String s);但未实现,导致编译器报错要求补全实现。

内容的提问来源于stack exchange,提问作者Egamad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 02:18:28