开启 class 输入 Dart

Switching on class type in Dart

我想在 Dart superclass 中编写一个函数,它根据实际使用它的 subclass 执行不同的操作。像这样:

class Foo {
  Foo getAnother(Foo foo) {
    var fooType = //some code here to extract fooType from foo;
    switch (fooType) {
      case //something about bar here:
        return new Bar();
      case //something about baz here:
        return new Baz();
    }
  }
}

class Bar extends Foo {}

class Baz extends Foo {}

我的想法是我有一些对象并想获得相同的新对象(子)class。

主要问题是 fooType 应该是什么类型?我的第一个想法是 Symbol,它会导致像 case #Bar: 这样简单的 case 语句,但我不知道如何用 Symbol 填充 fooType。我能想到的唯一选择是做类似 Symbol fooType = new Symbol(foo.runtimeType.toString()); 的事情,但我的理解是 runtimeType.toString() 在转换为 javascript 时不起作用。您可以通过使用 Mirrors 来解决这个问题,但这意味着是一个轻量级库,所以那些不在 table 上。 Object.runtimeType returns Type class 的一些东西,但我不知道如何创建 Type 的实例,我可以将其用于 case 语句。也许我遗漏了一些更适合这个的 Dart 库?

您可以在 switch 中使用 runtimeType :

class Foo {
  Foo getAnother(Foo foo) {
    switch (foo.runtimeType) {
      case Bar:
        return new Bar();
      case Baz:
        return new Baz();
    }
    return null;
  }
}

case 语句中直接使用 class 名称(又名 class 文字 )。这给出了一个对应于提到的 class 的 Type 对象。因此foo.runtimeType可以与指定的类型进行比较。

请注意 class 字面值 中的 you can not use generics for now。因此,case List<int>: 是不允许的。