Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 在实例化类时从特征继承_Scala_Types_Traits - Fatal编程技术网

Scala 在实例化类时从特征继承

Scala 在实例化类时从特征继承,scala,types,traits,Scala,Types,Traits,这是我正在处理的代码块。这是遗传算法的基因描述。我希望它是灵活的,允许不同类型的基因值(int、strings、ecc.ecc.)和不同的初始化策略。现在唯一不起作用的是,在IntGene的情况下,它说我需要初始化initVal,但我希望在实例化类时将它链接到InitStrategy实现(例如RandomInit)。如何延迟继承并从与实例关联的trait获取实现 abstract trait InitStrategy[T]{ def initVal(limit:Int=0):T } trai

这是我正在处理的代码块。这是遗传算法的基因描述。我希望它是灵活的,允许不同类型的基因值(int、strings、ecc.ecc.)和不同的初始化策略。现在唯一不起作用的是,在
IntGene
的情况下,它说我需要初始化
initVal
,但我希望在实例化类时将它链接到
InitStrategy
实现(例如
RandomInit
)。如何延迟继承并从与实例关联的trait获取实现

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)
}

你只需要把
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]