【问题标题】:Overriding method by return type in scala, oop solution?通过scala中的返回类型覆盖方法,oop解决方案?
【发布时间】:2011-11-30 22:46:17
【问题描述】:

我在 scala 中查找有关我的问题的 oop 信息时遇到了一些问题,您可以帮我找到一个好的解决方案或好的网络/书籍资源吗?

我有一个主要抽象类Operator

abstract class Operator[G <: AbstractGenome, F <: GenomeFactory[G]] {
  implicit val factory: F
  def operate (genomes: IndexedSeq[G])
}

和另外两个继承的抽象类:

abstract class Mutation [G <: AbstractGenome, F <: GenomeFactory [G]]  
  extends Operator [G, F] {
  override def operate (genomes: IndexedSeq[G]):G
}

abstract class CrossOver [G <: AbstractGenome, F <: GenomeFactory [G]]
  extends Operator [G, F] {
  override def operate (genomes: IndexedSeq[G]) (implicit aprng : Random):IndexedSeq[G]
  }

我的问题在这里,当我尝试实例化这些抽象类时,我无法使用不同的返回类型覆盖方法操作(..),此代码不起作用。

我已经有多行代码使用了返回唯一基因组 G 的突变操作()方法...我可以通过使用包装器来保存这个 OOP 结构,一个中间对象来捕获我的基因组,并绕过这个问题还有一个通用结构?

非常感谢您的灯, SR。

【问题讨论】:

    标签: oop scala types overriding


    【解决方案1】:

    如果您没有为抽象方法提供返回类型,则使用 Unit - 而不是您可能假设的 Any。只需将Operator 中的声明更改为

    def operate(genomes: IndexedSeq[G]): Any
    

    这在第二种情况下不起作用,因为您无法在覆盖方法时添加参数列表。您必须通过构造函数提供隐式参数或将其添加到基类的声明中。

    实现这一点的最简单方法是将返回类型的类型参数添加到Operation,并将特定实例所需的隐式参数放入实现的构造函数中,例如

    abstract class Operator[G <: AbstractGenome, F <: GenomeFactory[G], R] {
      implicit val factory: F
      def operate (genomes: IndexedSeq[G]): R
    }
    
    class CrossOver[G <: AbstractGenome, F <: GenomeFactory [G]](implicit r: Random)
      extends Operator [G, F, IndexedSeq[G]]
    

    【讨论】:

      猜你喜欢
      • 2023-04-08
      • 1970-01-01
      • 2021-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多