2011-11-30 41 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]] 
相關問題