我有一组模型类,以及一组可以在模型上运行的算法。并非所有类别的模型都可以执行所有算法。我希望模型类能够声明它们可以执行的算法。模型可以执行的算法可能取决于其参数。

示例:假设我有两个算法,MCMC 和重要性,表示为特征:

trait MCMC extends Model {
  def propose...
}

trait Importance extends Model {
  def forward...
}

我有一个模型类 Normal,它接受一个均值参数,它本身就是一个模型。现在,如果mean实现了MCMC,我希望Normal实现MCMC,如果mean实现Importance,我希望Normal实现Importance。

我可以写:
类正常(平均值:模型)扩展模型{
//一些常见的东西放在这里
}
class NormalMCMC(mean: MCMC) extends Normal(mean) with MCMC {
  def propose...implementation goes here
}

class NormalImportance(mean: Importance) extends Normal(mean) with Importance {
  def forward...implementation goes here
}

我可以创建工厂方法,以确保使用给定的平均值创建正确类型的 Normal。但显而易见的问题是,如果均值同时实现了 MCMC 和重要性呢?然后我希望 Normal 也实现它们。但我不想创建一个重新实现建议和转发的新类。如果 NormalMCMC 和 NormalImportance 不带参数,我可以使它们成为特征并将它们混合在一起。但在这里我希望混合取决于参数的类型。有没有好的解决办法?

最佳答案

使用 self types 允许您将模型算法实现与实例化分开并将它们混合在一起:

trait Model
trait Result
trait MCMC extends Model {
  def propose: Result
}
trait Importance extends Model {
  def forward: Result
}

class Normal(val model: Model) extends Model

trait NormalMCMCImpl extends MCMC {
  self: Normal =>
  def propose: Result = { //... impl
    val x = self.model // lookie here... I can use vals from Normal
  }
}
trait NormalImportanceImpl extends Importance {
  self: Normal =>
  def forward: Result = { // ... impl
      ...
  }
}

class NormalMCMC(mean: Model) extends Normal(mean)
                              with NormalMCMCImpl

class NormalImportance(mean: Model) extends Normal(mean)
                                    with NormalImportanceImpl

class NormalImportanceMCMC(mean: Model) extends Normal(mean)
                                        with NormalMCMCImpl
                                        with NormalImportanceImpl

关于Scala:mixins取决于参数的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2037556/

10-12 17:21