这是我想要写的内容:
val alg10 = new GeneticAlgorithm[FlatDesign]
with PhenotypeSize(10)
with FlatDesignMutator
with ChildrenReplaceParents(numChildren=2)
with TargetFitnessFunction(targetPhenotype)
with PopulationSize(40)
with RunLength(numGenerations=100)
换句话说,我想设置很多约束和参数。例如,PhenotypeSize(10)对mutator和适应度函数有影响。抽象类型应该使得实现/执行所有这些一致性约束变得容易。当然,特征不能采用参数,因此这些代码不会起作用。
我喜欢写作特质如何让你混合和匹配你需要的任何功能。上面的代码是如此可读!有了这样的代码,我可以轻松地编写一个循环来试验骰子的很多和算法的变化。
但是,我找不到为这些特征提供参数的干净方法。有什么建议吗?答案 0 :(得分:2)
早期定义在Programming in Scala中描述为"预先初始化的字段"或者5.1.6 of the spec并且具有您期望的特征参数的语义,即它们是available in constructors。
val alg10 = new { val size = 10 } with GeneticAlgorithm[FlatDesign]
with PhenotypeSize { val size: Int ; val psize = 2 * size }
这个问题必须重复。
答案 1 :(得分:1)
这可能就是你已经在做的事情,但为了以防万一,如果你定义这样的特征:
trait PhenotypeSize {
val size: Int
...
}
trait FlatDesignMutator { ... }
trait ChildrenReplaceParents {
val numChildren: Int
...
}
...
然后你的课将如下:
class GeneticAlgorithm[T]
extends PhenotypeSize
with FlatDesignMutator
with ChildrenReplaceParents
with ... {
override val size: Int = 2
override val numChildren: Int = 10
...
}
编译器将检查您是否在size
类实现中为成员numChildren
,GeneticAlgorithm
等提供了正确的定义。这听起来相当不错,简洁。