Mam zestaw klas modeli i zestaw algorytmów, które można uruchomić na modelach. Nie wszystkie klasy modeli mogą wykonywać wszystkie algorytmy. Chcę, aby klasy modeli mogły zadeklarować jakie algorytmy mogą wykonać. Algorytmy, które może wykonać model, mogą zależeć od jego argumentów.scala: mixins w zależności od rodzaju argumentów
Przykład: Załóżmy, mam dwa algorytmy MCMC i znaczenie reprezentowane jako cechy:
trait MCMC extends Model {
def propose...
}
trait Importance extends Model {
def forward...
}
mam klasę modelu Normalny, która przyjmuje średnią argumentu, który sam model. Teraz, jeśli średnia implementuje MCMC, chcę, aby Normal implementował MCMC, i jeśli średnia implementuje Ważność, chcę, żeby Normalna implementowała Ważność.
mogę napisać: klasa normalna (znaczy: Wzorcowa) rozciąga model { // niektóre wspólne rzeczy idzie tu }
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
}
mogę utworzyć metody fabryki, upewnij się, że odpowiedni rodzaj Normal dostaje stworzone z podanym środkiem. Ale oczywiste pytanie brzmi: co jeśli implementuje MCMC i znaczenie? Potem chcę, żeby Normal także zaimplementował oba. Ale nie chcę tworzyć nowej klasy, która reimplements proponuje i przekazuje dalej. Gdyby NormalMCMC i NormalImportance nie przyjmowały argumentów, mógłbym zrobić z nich cechy i je połączyć. Ale chcę, żeby mieszanie było zależne od typu argumentu. Czy istnieje dobre rozwiązanie?