scala中的返回类型覆盖方法,oop解决方案?

时间:2011-11-30 14:18:42

标签: oop scala types override

我有一些问题需要在scala中找到关于我的问题的oop信息,peraphs你可以帮我找到一个好的解决方案,还是好的网络/书籍资源?

我有一个主要的抽象类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。

1 个答案:

答案 0 :(得分:3)

如果您没有为抽象方法提供返回类型,则使用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]]