我希望在Dart父类(super class)中编写一个函数,该函数根据实际使用哪个子类来执行不同的操作。像这样:

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:这样的简单案例语句,但我不知道如何用Symbol填充fooType。我能想到的唯一选择是做类似Symbol fooType = new Symbol(foo.runtimeType.toString());的操作,但我的理解是,转换为javascript时runtimeType.toString()无法使用。您可以通过使用Mirrors来解决此问题,但这是一个轻量级的库,因此不在表中。 Object.runtimeType返回Type类的内容,但是我不知道如何创建可用于case语句的Type实例。也许我错过了Dart库中更适合此功能的其他部分?

最佳答案

您可以在runtimeType中使用switch:

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

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

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

08-05 08:51