簡體   English   中英

在Dart中打開類類型

[英]Switching on class type in 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語句,如case #Bar: ,但我不知道如何使用Symbol填充fooType 我能想到的唯一選擇是做一些像Symbol fooType = new Symbol(foo.runtimeType.toString()); 但我的理解是,當轉換為javascript時, runtimeType.toString()將不起作用。 你可以通過使用Mirrors來解決這個問題,但這應該是一個輕量級的庫,所以這些不在桌面上。 Object.runtimeType返回Type類的一些內容,但我不知道如何創建Type I可用於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語句中,類名是直接使用的(aka .class literal )。 這給出了一個與提到的類對應的Type對象。 因此,可以將foo.runtimeType與指定的類型進行比較。

請注意, 您現在不能類文字中 使用泛型 因此,不允許使用case List<int>: :。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM