开启 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>:
是不允许的。
我想在 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>:
是不允许的。