我试图找到一种在通用类型上调用方法的方法。但是找不到它。
我可以迅速写成:
protocol SomeGeneric {
static func createOne() -> Self
func doSomething()
}
class Foo: SomeGeneric {
required init() {
}
static func createOne() -> Self {
return self.init()
}
func doSomething() {
print("Hey this is fooooo")
}
}
class Bar: SomeGeneric {
required init() {
}
static func createOne() -> Self {
return self.init()
}
func doSomething() {
print("Hey this is barrrrrrr")
}
}
func create<T: SomeGeneric>() -> T {
return T.createOne()
}
let foo: Foo = create()
let bar: Bar = create()
foo.doSomething() //prints Hey this is fooooo
bar.doSomething() //prints Hey this is barrrrrrr
在Dart中,我尝试过:
abstract class SomeGeneric {
SomeGeneric createOne();
void doSomething();
}
class Foo extends SomeGeneric {
@override
SomeGeneric createOne() {
return Foo();
}
@override
void doSomething() {
print("Hey this is fooooo");
}
}
class Bar extends SomeGeneric {
@override
SomeGeneric createOne() {
return Bar();
}
@override
void doSomething() {
print("Hey this is barrrrr");
}
}
T create<T extends SomeGeneric>() {
return T.createOne();//error: The method 'createOne' isn't defined for the class 'Type'.
}
代码给出错误The method 'createOne' isn't defined for the class 'Type'
如何解决?如果可能的话,将节省大量时间和大量代码行。
答案 0 :(得分:1)
不可能。在Dart中,您无法通过类型变量调用静态方法,因为静态方法必须在编译时解析,并且类型变量在运行时才具有值。 Dart接口不是Swift协议,它们只能指定实例方法。
如果要对具有创建类型的新对象的功能的类进行参数化,则需要传递函数:
void floo<T>(T create(), ...) {
...
T t = create();
...
}
您不能仅仅依靠类型变量。