Я хочу инкапсулировать реальный тип неизменяемого объекта решения в реализацию модификатора, но не могу найти способ избежать опускания. Как я могу написать Listeners независимо от типа решения, не делая для них параметр типа?Как абстрагироваться от типа неизменяемого значения, выполняющего его преобразования?
Следующий код иллюстрирует, что downcasts являются неотвратимыми, если Listener не знает о конкретном типе решения.
trait Solution {} //Immutable abstact class
trait Listener(val modifier: Modifier) {
def onChange(iSolution: Solution): Solution
}
trait Modifier { //Implementations use different descendants of Solution
def addListener(listener: Listener)
def emptySolution: Solution
def transfrom1(iSolution: Solution): Solution //Downcast of argument can’t be avoided in implementations of these
def transfrom2(iSolution: Solution): Solution
}
class Listener1 extends Listener { //Should be independent from Solution concrete type. Current implentation meets this requirement by introducing downcasts in Modifier.
val modifier: Modifier
def onChange(iSolution: Solution) = modifier.transform1(modifier.transform2(iSolution)) // Some action involving solution transformations with modifier
}
Ваш Listener1 зависит от типа модификатора. Вы должны сообщить своему слушателю, что тип в конструкции, который по существу эквивалентен аргументу типа. – Basilevs