モデルのクラスのセットと、モデルで実行できるアルゴリズムのセットがあります。モデルのすべてのクラスがすべてのアルゴリズムを実行できるわけではありません。モデル クラスで、実行できるアルゴリズムを宣言できるようにしたいと考えています。モデルが実行できるアルゴリズムは、その引数に依存する場合があります。
例: 特性として表される 2 つのアルゴリズム MCMC と Importance があるとします。
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
モデル クラス Normal があります。これは、それ自体が Model である mean 引数を取ります。ここで、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
}
適切な種類の法線が特定の手段で作成されるようにするファクトリ メソッドを作成できます。しかし明らかな疑問は、もし mean が MCMC と Importance の両方を実装しているとしたら? 次に、Normal にも両方を実装してもらいたいと思います。しかし、提案と転送を再実装する新しいクラスを作成したくありません。NormalMCMC と NormalImportance が引数を取らない場合は、それらをトレイトにして混合することもできます。しかし、ここでは、混合を引数の型に依存させたいと考えています。良い解決策はありますか?