我有一组模型类,以及一组可以在模型上运行的算法。并非所有类别的模型都可以执行所有算法。我希望模型类能够声明它们可以执行的算法。模型可以执行的算法可能取决于其参数。
示例:假设我有两个算法,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/