最小的可重現代碼:
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
將解決這個問題,但我的專案中有很多列舉,所以我不能像這樣投射它們。
另外,請不要發布諸如 use 之類的答案toUpperCase()
,因為我只是提供了一個簡單的示例,但在現實世界中,情況完全不同。
uj5u.com熱心網友回復:
您不能覆寫name
getter “on Enum
”,因為它是擴展 getter,而不是實體 getter。壓倒一切,又名。實體成員的后期系結僅適用于實際(虛擬)實體成員。
擴展成員是靜態決議的,因此呼叫.name
要么命中擴展成員,要么不命中,這完全取決于接收者的靜態型別。如果你有一個Enum e; ... e.name ...
then 它將呼叫擴展成員,并且絕對沒有辦法改變它,或者改變它的作用。
如果您想擁有一個自定義且可覆寫的name
getter,我會引入一個類似的介面
abstract class NamedEnum extends Enum {
String get name;
}
然后讓你所有的列舉實作NamedEnum
. 然后你可以(enumValue as NamedEnum).name
為你的任何列舉做。它不會與其他enum
型別的擴展name
getter 互動。
uj5u.com熱心網友回復:
只要您確保該屬性存在于您正在列印的列舉中,就可以將其轉換e
為作品。前任:dynamic
name
void printEnum<T extends Enum>(List<T> list) {
for (var e in list) {
print((e as dynamic).name);
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/530612.html
標籤:镖