在Dart中打开类类型

时间:2015-01-22 08:37:45

标签: dart

我正在寻找在Dart超类中编写一个函数,该函数根据实际使用它的子类采取不同的操作。像这样:

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 {}

其中的想法是我有一些对象,并希望获得同一(子)类的新对象。

主要问题是fooType应该是什么类型?我的第一个想法是Symbol,这导致了像case #Bar:这样简单的案例陈述,但我不知道如何用符号填充fooType。我能想到的唯一选择是执行Symbol fooType = new Symbol(foo.runtimeType.toString());之类的操作,但我的理解是runtimeType.toString()在转换为javascript时无效。你可以通过使用Mirrors来解决这个问题,但这应该是一个轻量级的库,所以这些不在桌面上。 Object.runtimeType返回Type类的某些内容,但我不知道如何创建可用于case语句的Type实例。也许我错过了一些更适合这个的Dart库?

1 个答案:

答案 0 :(得分:17)

您可以使用runtimeType中的switch

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

case语句中,类名直接使用(aka。 class literal )。这给出了与提到的类相对应的Type对象。因此foo.runtimeType可以与指定的类型进行比较。

请注意类文字中的you can not use generics for now 。因此不允许case List<int>: