[英]Overriding Dart methods with Generics arguments
我有这样一个案例,我从一个超类扩展而来,方法是使用泛型键入的,如下所示:
abstract class SuperClass {
//.....
}
class SubClass extends SuperClass {
int a;
int b;
String c;
//....
}
abstract class A {
T getDoc<T extends SuperClass>(T doc);
}
class B extends A {
T getDoc<T extends SubClass>(T doc) { //<================ Error
//....
}
}
基本上B
类只会处理SubClass
模型和扩展它的任何类。 扩展SuperClass
是不够的。 这是一种强制使用类型的方法。 我可以添加一个辅助函数来检查B
类中每个方法的类型( doc is SubClass
),但似乎重复了很多。
但是当覆盖类 B 中的方法getDoc
时,上述架构失败,说它不是有效的覆盖,尽管SubClass
是SuperClass
。 我怎样才能实现这样的目标? 或者有更好的方法吗? 感谢任何指针:)
我终于找到了一种方法:)
所以我希望B
类的方法只接受扩展SubClass
类型,但A
类方法的签名需要扩展类SuperClass
参数。
为此,我执行了以下操作:
abstract class SuperClass {
//.....
}
class SubClass extends SuperClass {
int a;
int b;
String c;
//....
}
abstract class A<K extends SuperClass> {
T getDoc<T extends K>(T doc);
}
class B extends A<SubClass> {
T getDoc<T extends SubClass>(T doc) {
//.......
}
}
你可以使用协变修饰符吗?
在你的例子中:
abstract class A {
T getDoc<T extends SuperClass>(covariant T doc);
}
检查: https : //github.com/dart-lang/sdk/blob/master/docs/language/informal/covariant-overrides.md
您不能缩小泛型类型参数的范围。 类B
担保(通过扩展类A
),它将/可以处理所有类型的参数(和子类型!),该类A
可以处理。 考虑以下情况:
class OtherSubClass extends SuperClass {
//....
}
void main() {
var b = B();
b.getDoc(OtherSubClass());
}
你希望发生什么? B
类无法处理OtherSubClass
类型的OtherSubClass
,因此它违反了与A
类的约定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.