我有一些问题需要在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。
答案 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]]