我想在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 {}

这里的 idea 是,我有一些对象,并希望得到一个相同(子)类的新对象.

主要问题是fooType应该是什么类型?我的第一个 idea 是符号,这会导致简单的case语句,比如case #Bar:,但是我不知道如何用符号填充fooType.我能想到的唯一 Select 是做类似Symbol fooType = new Symbol(foo.runtimeType.toString());的事情,但我的理解是runtimeType.toString()在转换成javascript时不能工作.您可以通过使用Mirrors来解决这个问题,但是这是一个轻量级的库,所以它们不在桌面上.Object.runtimeType返回Type类的一些内容,但是我不知道如何创建可以用于case语句的Type实例.也许我错过了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语句中,直接使用类名(AKAclass literal).这将给出一个与提到的类相对应的Type对象.因此,可以将foo.runtimeType与指定类型进行比较.

请注意,class literals中有you can not use generics for now个.因此,case List<int>:是不允许的.

Dart相关问答推荐

Dart 中 ThemeData 类的 copyWith() 方法

dart 中的 Function() 和 Function 有什么区别?

Flutter 是否提供即时应用程序?

当 ng-repeat 嵌套在 AngularDart 中时访问外部 $index

Card宽度与父级匹配

使用 headers 和 body 进行 HTTP Post

将 Flutter 前端与 Android 和 iOS 的 .NET Core 后端相结合

如何使用文本小部件设置多行文本?

Stack inside Stack in flutter

错误:非抽象类InternalSelectableMathState

如何判断设备是否需要 SafeArea?

'dart:async' 的函数 `runZoned` 的用途

找到两个数字中larger/smaller的方法是什么

Dart 库中part和part of背后的原因是什么?

如何创建类型别名

安装 dart-sdk 后找不到 pub 命令

使用 Dart 将 Uint8List 转换为字符串

如何将多个 Stream 合并为更高级别的 Stream?

如何在 Dart 中获取时间戳?

什么是 ?? Dart 中的双问号?