У меня есть набор классов моделей и набор алгоритмов, которые можно запускать на моделях. Не все классы моделей могут выполнять все алгоритмы. Я хочу, чтобы классы моделей могли объявлять, какие алгоритмы они могут выполнять. Алгоритмы, которые может выполнять модель, могут зависеть от ее аргументов.
Пример: скажем, у меня есть два алгоритма, MCMC и Важность, представленные в виде черт:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
У меня есть класс модели Normal, который принимает средний аргумент, который сам является Моделью. Теперь, если Mean реализует MCMC, я хочу, чтобы Normal реализовал MCMC, а если mean реализует Важность, я хочу, чтобы Normal реализовал Важность.
Я могу написать:
Класс Normal (имеется в виду: Model) расширяет 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, и важность Тогда я хочу, чтобы Normal тоже их обоих реализовал. Но я не хочу создавать новый класс, который предлагает и продвигает переопределения. Если бы NormalMCMC и NormalImportance не принимали аргументы, я мог бы сделать их чертами и смешать их. Но здесь я хочу, чтобы смешивание зависело от типа аргумента. Есть ли хорошее решение?