Tengo un conjunto de clases de modelos y un conjunto de algoritmos que se pueden ejecutar en los modelos. No todas las clases de modelos pueden realizar todos los algoritmos. Quiero que las clases modelo puedan declarar qué algoritmos pueden realizar. Los algoritmos que puede realizar un modelo pueden depender de sus argumentos.scala: mixins según el tipo de argumentos
Ejemplo: Digamos que tengo dos algoritmos, MCMC, e importancia, representados como rasgos:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
Tengo una clase del modelo normal, que toma un argumento media, que es en sí mismo un modelo. Ahora, si mean implementa MCMC, quiero que Normal implemente MCMC, y si mean implementa Importancia, quiero que Normal implemente Importancia.
Puedo escribir: clase normal (media: Modelo) se extiende modelo {// algunas cosas comunes va aquí}
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
}
puedo crear métodos de fábrica que hacen que el tipo correcto de la Normal se creado con una media determinada. Pero la pregunta obvia es, ¿qué pasa si Mean implementa tanto MCMC como Importance? Entonces quiero que Normal implemente ambos también. Pero no quiero crear una nueva clase que los reembolsos propongan y reenvíen. Si NormalMCMC y NormalImportance no toman argumentos, podría convertirlos en rasgos y mezclarlos. Pero aquí quiero que la mezcla dependa del tipo de argumento. ¿Hay una buena solución?