繁体   English   中英

使用泛型参数覆盖 Dart 方法

[英]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时,上述架构失败,说它不是有效的覆盖,尽管SubClassSuperClass 我怎样才能实现这样的目标? 或者有更好的方法吗? 感谢任何指针:)

我终于找到了一种方法:)

所以我希望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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM