2015-07-03 76 views
0

因此,我想将这些各种特征混合到称为GPState(遗传编程状态)的基类中。然而,我想要混入的一些东西取决于我直到正在构建GPState时才会知道的事情。因此我使用scala的路径依赖特性。在路径依赖性状中混合

说我路径依赖的特征看起来是这样的

case class HasTermGen[...](depths : Seq[Int], widths : Seq[Int]) { 
    trait gen extends GPState[...] { 
    override def genInitTerm(): Term = { 
     <...some stuff here depending on 'depths' and 'widths'...> 
    } 
    } 
} 

现在,当我想建立一个GPState我希望能够做这样的事

val gpstate = new GPState[Var, Type, Term, Double] 
       with <...some mixin...> 
       <...some other mixins that do other stuff...> 
       with HasTermGen[...](3 to 7, 4 to 9).gen 

但是这似乎是一个语法错误。我可以做到这一点,如果我首先定义一个易变的

val hasTermGen = HasTermGen[...](3 to 7, 4 to 9) 
val gpstate = new GPState[Var, Type, Term, Double] 
       with <...some mixin...> 
       <...some other mixins that do other stuff...> 
       with hasTermGen.gen 

但是,这看起来很丑陋的一面。

我愿意放弃这个特定的语法,甚至使用类似'HasTermGen'等许多其他的东西。我真正需要的是能够根据建筑工地定义的信息创建一个以特定方式实现GPState方法的对象。此外,实施这些方法的手段可能会有一些共同的元素(数据明智),他们将要利用,以便需要考虑。有一个更好的方法吗?

回答

0

您的性别GPState取决于HasTermGen的实例。

val myTermGen = HasTermGen[...](3 to 7, 4 to 9) 
val myState = new myTermGen[...] { ... } 
+0

对不起,我不明白你要在这里传达什么。介意多解释一下? – Jake