Я пытаюсь создать систему, которая позволяет пользователям объединять в цепочку несколько процессоров. Моя трудность заключается в том, что у каждого процессора на самом деле есть два бита информации, о которых он заботится, и я хочу, чтобы они обрабатывались безопасным для типов способом. Я свел это к этой проблеме:
Данный:
//First family of stuff
trait A {
def doA {}
}
trait B {
def doB {}
}
//Second family of stuff
trait X {
def doX {}
}
trait Y {
def doY {}
}
Я могу объединить элементы из двух семейств вместе в 4 вкуса:
var f = new A with X {}
f.doA
d.doX
var g = new A with Y {}
//...
Здорово. Проблема в том, что я хочу, чтобы каждая из функций (doA и т. Д.) Возвращала комбинацию двух типов, чтобы я мог связать вещи вместе. По сути, я хочу сделать: trait A {def doThing = {new A with ThingThatImMixedInWithLikeXOrY {}}}
Каждый процессор должен возвращать анонимный класс, который состоит из 1) типа, известного процессору 2) типа, с которым он был смешан.
Моим первым ударом было использование дженериков, примерно так:
trait A {
this : {def makeWithT[TOther]} =>
def doA = makeWithT[B]
}
trait B {
this : {def makeWithT[TOther]} =>
def doB = makeWithT[A]
}
trait X {
this : {def makeWithS[TOther]} =>
def doX = makeWithT[Y]
}
trait Y {
this : {def makeWithS[TOther]} =>
def doY = makeWithT[Y]
}
class Foo[T, S] extends S with T {
def makeWithT[OtherT] = new T with OtherT
def makeWithS[OtherT] = new S with OtherT
}
var f = new Foo[A, X]
f.doA.doB
f.doX.doA
f.doX.doY
...
Очевидно, я столкнулся с целым рядом проблем:
Я не могу создать общий класс, который расширяется от параметров типа
Я не могу создать экземпляр своего анонимного класса с помощью универсального параметра
Я не могу определить возвращаемый тип функций в трейте, потому что я не знаю тип, пока он не смешается с чем-то.
Я немного новичок, когда дело доходит до scala, и у меня такое чувство, что я делаю это совершенно неправильно и, возможно, мне следует использовать имплициты и шаблон CanBuildFrom. Любая помощь будет принята с благодарностью.
Ваше здоровье