【问题标题】:Overriding Dart methods with Generics arguments用泛型参数覆盖 Dart 方法
【发布时间】:2020-06-03 06:17:37
【问题描述】:

我有这种情况,我从一个超类扩展,使用泛型键入方法,如下所示:

型号

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,但它不是有效的覆盖。我怎样才能实现这样的目标?或者有更好的方法吗?感谢任何指针:)

【问题讨论】:

    标签: oop generics dart polymorphism


    【解决方案1】:

    你可以使用协变修饰符吗?

    在你的例子中:

    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

    【讨论】:

      【解决方案2】:

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

      所以我希望 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) {     
                //.......
          }       
      }
      
      

      【讨论】:

      • 请分享一个你的代码的pastebin,我去看看。
      • 我发现了错误。是因为我的抽象类A,继承自StatefulWidget并实现了状态类。 class _AState extends State 现在我需要解决这个问题
      【解决方案3】:

      您不能缩小泛型类型参数。 B 类保证(通过扩展 A 类),它将/可以处理所有类型参数(和子类型!),该类 A 可以处理。考虑以下情况:

      class OtherSubClass extends SuperClass {
        //....
      }
      
      void main() {
        var b = B();
        b.getDoc(OtherSubClass());
      }
      

      您希望发生什么? B 类无法处理 OtherSubClass 类型的对象,因此它违反了与 A 类的约定。

      【讨论】:

      • 我的错,我已经编辑了类架构并详细说明了我想要实现的目标。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多