最小可重现代码:
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()等答案,因为我只是提供了一个简单的例子,但在现实世界中,事情是完全不同的。
您不能覆盖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 交互。
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |