我有一组模型类别和一组可应用于这些模型上的算法。并非每种模型都能执行所有算法。我希望模型类别能够声明它们可以执行哪些算法。模型能够执行的算法可能取决于其参数。
例如:假设我有两个算法MCMC和Importance,它们被表示为traits:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
我有一个模型类Normal,它接受一个mean参数,这个参数本身也是一个Model。现在,如果mean实现了MCMC,我希望Normal也实现MCMC,如果mean实现了Importance,我希望Normal也实现Importance。
我可以这样写: class Normal(mean: Model) extends Model { // 共同的部分放在这里 }
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。但是显而易见的问题是,如果mean同时实现了MCMC和Importance怎么办?那么我希望Normal也能同时实现它们两个。但我不想创建一个重新实现propose和forward的新类。如果NormalMCMC和NormalImportance没有参数,我可以将它们变成traits并进行混合。但是在这里,我希望混入取决于参数的类型。有好的解决方案吗?