gpt4 book ai didi

dart - 如何覆盖枚举的 "name"属性?

转载 作者:行者123 更新时间:2023-12-03 08:00:36 25 4
gpt4 key购买 nike

最小可重现代码:

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);
}
}

for 循环打印

a
b

但我想打印它

A
B

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


注意:

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

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

最佳答案

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

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

如果你想要一个自定义且可重写的name getter,我会引入一个类似的接口(interface)

abstract class NamedEnum implements Enum {
String get name;
}

然后让所有枚举实现NamedEnum。然后您可以对任何枚举执行 (enumValue as NamedEnum).name 。它不会与其他 enum 类型的扩展 name getter 交互。

关于dart - 如何覆盖枚举的 "name"属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74376956/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com