我在scala中找到关于我的问题的oop信息时遇到了一些问题,你能帮我找到一个好的解决方案吗,或者是好的web/书籍资源?
我有一个主要的抽象类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]
}我的问题在这里,我不能重写方法operate(..)当我尝试实例化这些抽象类时,使用不同的返回类型,此代码不起作用。
我已经有了多行代码,这些代码使用突变操作()方法返回一个唯一的基因组G…我可以通过使用包装器来保存这种OOP结构吗?包装器是捕获我的基因组的中间对象,并使用泛型结构绕过这个问题?
谢谢你的灯光,SR。
发布于 2011-11-30 22:27:38
如果您没有为抽象方法提供返回类型,则会使用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]]https://stackoverflow.com/questions/8327328
复制相似问题