当我实例化 class 时从特征继承
Inherit from a trait when I instantiate a class
这是我正在处理的代码块。这是遗传算法的基因描述。我希望它灵活并允许不同类型的基因值(整数、字符串、ecc.ecc.)和不同的初始化策略。现在唯一不起作用的是,在 IntGene
的情况下,它说我需要初始化 initVal
但我希望它链接到 InitStrategy
实现(对于例如 RandomInit
) 当我实例化 class 时。我怎样才能延迟继承并从我关联到实例的特征中获取实现?
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]
这是我正在处理的代码块。这是遗传算法的基因描述。我希望它灵活并允许不同类型的基因值(整数、字符串、ecc.ecc.)和不同的初始化策略。现在唯一不起作用的是,在 IntGene
的情况下,它说我需要初始化 initVal
但我希望它链接到 InitStrategy
实现(对于例如 RandomInit
) 当我实例化 class 时。我怎样才能延迟继承并从我关联到实例的特征中获取实现?
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]