【问题标题】:What is the usecase of Enum interface in Dart 2.14Dart 2.14 中 Enum 接口的用例是什么
【发布时间】:2021-08-09 05:47:40
【问题描述】:

我查看了 Dart SDK 的 changelogs,并在 Dart SDK v2.14 的发行说明中注意到了这一点:

我找不到任何关于此的文档!我可以在哪里使用这个?我试图实现它,但它没有工作!

【问题讨论】:

  • 您可以在所有枚举上添加扩展方法,而不需要在每个特定枚举上应用扩展方法。
  • 另一个用例,您可以定义必须从 Enum 扩展的泛型,以制作只接受枚举的方法和类。

标签: dart dart-sdk


【解决方案1】:

所有enum 声明类型的Enum 超级接口的用例导致该接口被添加,主要是请求对枚举进行抽象的能力。

最常见的请求之一是从枚举中提取名称。 示例:

enum FooBar {
 foo, bar;
}

人们会要求一种从值FooBar.foo 中获取字符串"foo" 的方法。 名称​​toString 中可用,它返回字符串"FooBar.foo",但无法通过其他方式访问。

常见的做法是做

String enumName(dynamic value) {
  var string = enumValue.toString();
  return string.substring(string.indexOf('.') + 1);
}

您不能将value 限制为仅枚举值,因为无法识别类型系统中的枚举值。现在可以写成

String enumName(Enum value) { ... }

取而代之,或作为扩展:

extension EnumName on Enum {
  String get name => ....;
}

(该扩展的优点是它不会阻止您拥有一个带有name 成员的枚举,比如enum PostalReceiver { name, address, zip, country; },而实例成员会这样做)。

另一个例子是 Java EnumSet 的副本:

class EnumSet<T extends Enum> {
  int _bits = 0;
  final List<T> _values;
  EnumSet(List<T> values) : _values = values {
    if (values.length > 32) throw UnsupportedError("Too big");
  }
  void add(T value) {
    _bits |= 1 << value.index;
  }
  void remove(T value) {
    _bits &= ~(1 << value.index);
  }
  bool contains(T value) => _bits & (1 << value.index) != 0;
}

现在可以很好地键入它,仅限于枚举,并且 .index 操作是静态类型化的以返回 int。 如果没有Enum 接口,就无法仅限于枚举,也无法访问.index,除非动态调用。

枚举仍然受到限制,除了创建enum之外,您无法实现该接口。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-02
    • 2020-12-31
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多