J'ai un ensemble de classes de modèles, et un ensemble d'algorithmes qui peuvent être exécutés sur les modèles. Toutes les classes de modèles ne peuvent pas exécuter tous les algorithmes. Je veux que les classes de modèles puissent déclarer quels algorithmes ils peuvent effectuer. Les algorithmes qu'un modèle peut effectuer peuvent dépendre de ses arguments.scala: mixins en fonction du type d'arguments
Exemple: Dire que j'ai deux algorithmes, MCMC, et l'importance, représentés comme des traits:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
J'ai une classe de modèle normal, qui prend un argument moyen, qui est lui-même un modèle. Maintenant, si mean implémente MCMC, je veux que Normal implémente MCMC, et si mean implémente Importance, je veux que Normal implémente Importance.
Je peux écrire: classe normale (moyenne: Model) étend le modèle { // des choses communes va ici }
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
}
Je peux créer des méthodes d'usine qui font que le bon type de normal obtient créé avec un moyen donné. Mais la question évidente est, et si le moyen implémente à la fois MCMC et Importance? Ensuite, je veux que Normal les implémente tous les deux. Mais je ne veux pas créer une nouvelle classe que réimplémente proposer et transmettre. Si NormalMCMC et NormalImportance ne prenaient pas d'arguments, je pourrais en faire des traits et les mélanger. Mais ici, je veux que le mixage dépende du type de l'argument. Y a-t-il une bonne solution?