我实例化一个类时从一个特征继承

时间:2015-06-24 15:28:50

标签: scala types traits

这是我正在处理的代码块。这是遗传算法的基因描述。我希望它具有灵活性,允许不同类型的基因值(int,strings,ecc.ecc。)和不同的初始化策略。现在,唯一不起作用的是,在IntGene的情况下,它表示我需要初始化initVal,但我希望将其链接到InitStrategy实现(for示例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)
}

1 个答案:

答案 0 :(得分: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]