2011-11-30 49 views
3

我有一些问题找到关于我的问题在斯卡拉oop信息,peraphs你可以帮我找到一个好的解决方案,或良好的网络/书资源?通过在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] 
    } 

我的问题就在这里,我不能覆盖的方法进行操作(..)不同返回类型时,我试图instancite这些抽象类,此代码不起作用。

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

非常感谢您的灯光, SR。

回答

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]]