2015-06-24 3 views
0

Это блок кода, над которым я работаю. Это описание гена генетического алгоритма. Я хочу, чтобы он был гибким и учитывал разные типы генных значений (int, strings, ecc. Ecc.) И различные стратегии инициализации. В настоящее время единственное, что не работает, это то, что в случае IntGene он говорит, что мне нужно инициализировать initVal, но я хочу, чтобы он был связан с реализацией InitStrategy (например, RandomInit) при создании экземпляра класса. Как я могу отложить наследование и взять реализацию из свойства, которое я связываю с экземпляром?Наследовать от свойства при создании экземпляра класса

abstract trait InitStrategy[T]{ 
    def initVal(limit:Int=0):T 
} 
trait RandomInit[T] extends InitStrategy[T]{ 
    this:{def randomFunc(limit:Int):T}=>{ 

    def initVal(limit:Int=0):T=this.randomFunc(limit) 
    } 
} 

abstract trait Gene[T] 

case class IntGene(v:Option[Int]=None,limit:Int=0) extends Gene[Int] with InitStrategy[Int]{ 

    val value=v match{ 
    case None => initVal(limit) 
    case Some(x)=> x 
    } 
    def randomFunc(limit:Int):Int= (new Random).nextInt(limit) 
} 

ответ

0

Вам просто нужно сделать IntGene признаком. Нечто подобное может работать:

trait IntGene extends Gene[Int] with InitStrategy[Int]{ 
    val v: Option[Int] 
    val limit: Int 
    val value = v match { 
    case None => initVal(limit) 
    case Some(x)=> x 
    } 
    def randomFunc(limit: Int):Int= (new Random).nextInt(limit) 
} 

И тогда вы можете создать экземпляр реализаций, расширяя эту черту, и InitStrategy реализации. В примере RandomInit вы можете попробовать:

case class RandomIntGene(v: Option[Int], limit: Int) extends IntGene with RandomInit[Int] 
Смежные вопросы