代替特质论点

时间:2014-05-12 02:48:55

标签: scala mixins traits

这是我想要写的内容:

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和适应度函数有影响。抽象类型应该使得实现/执行所有这些一致性约束变得容易。当然,特征不能采用参数,因此这些代码不会起作用。

我喜欢写作特质如何让你混合和匹配你需要的任何功能。上面的代码是如此可读!有了这样的代码,我可以轻松地编写一个循环来试验骰子的很多和算法的变化。

但是,我找不到为这些特征提供参数的干净方法。有什么建议吗?

2 个答案:

答案 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类实现中为成员numChildrenGeneticAlgorithm等提供了正确的定义。这听起来相当不错,简洁。