我有一组模型类,以及一组可以在模型上运行的算法。并非所有类别的模型都可以执行所有算法。我希望模型类能够声明它们可以执行哪些算法。模型可以执行的算法可能取决于它的参数。
示例:假设我有两个算法,MCMC 和重要性,表示为特征:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
我有一个模型类 Normal,它接受一个均值参数,它本身就是一个模型。现在,如果 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 也实现它们。但我不想创建一个重新实现建议和转发的新类。如果 NormalMCMC 和 NormalImportance 不带参数,我可以使它们成为特征并将它们混合在一起。但在这里我希望混合取决于参数的类型。有没有好的解决方案?