如何覆盖枚举的“名称”属性?

iDe*_*ode 3 dart

最小可重现代码:

enum Foo {
  a,
  b;

  String get name {
    switch (this) {
      case Foo.a: return 'A';
      case Foo.b: return 'B';
    }
  }
}

void main() {
  printEnum<Foo>(Foo.values);
}

void printEnum<T extends Enum>(List<T> list) {
  for (var e in list) {
    print(e.name);
  }
}
Run Code Online (Sandbox Code Playgroud)

循环for打印

a
b
Run Code Online (Sandbox Code Playgroud)

但我想把它打印出来

A
B
Run Code Online (Sandbox Code Playgroud)

那么,如何覆盖name枚举中的属性呢?


笔记:

使用(e as Foo).name可以解决这个问题,但是我的项目中有很多枚举,所以我不能像这样转换它们。

另外,请不要发布诸如 usetoUpperCase()等答案,因为我只是提供了一个简单的例子,但在现实世界中,事情是完全不同的。

lrn*_*lrn 5

您不能覆盖namegetter“on Enum”,因为它是扩展 getter,而不是实例 getter。压倒一切,又名。实例成员的后期绑定仅适用于实际(虚拟)实例成员。

扩展成员是静态解析的,因此 的调用.name要么命中扩展成员,要么不命中,这完全取决于接收者的静态类型。如果你有一个Enum e; ... e.name ...,那么它会调用扩展成员,并且绝对没有办法改变它,或者改变它的作用。

如果你想要一个自定义的、可重写的namegetter,我会引入一个像

abstract class NamedEnum implements Enum {
  String get name;
}
Run Code Online (Sandbox Code Playgroud)

然后让你所有的枚举实现NamedEnum。然后你可以(enumValue as NamedEnum).name为你的任何枚举做。它不会与其他enum类型的扩展namegetter 交互。