2011-01-25 6 views
1

Я хочу инкапсулировать реальный тип неизменяемого объекта решения в реализацию модификатора, но не могу найти способ избежать опускания. Как я могу написать 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 
} 

ответ

4

В вашем вопросе уже есть один возможный ответ - вы можете использовать абстрактные типы.

Вот пример, который может помочь вам:

trait Solution {} 
trait Listener { 
    val modifier: Modifier 
    def onChange(iSolution: modifier.solType): modifier.solType 
} 
trait Modifier { 
    type solType <: Solution 
    def addListener(listener: Listener) 
    def emptySolution: Solution 
    def transform1(iSolution: solType): solType 
    def transform2(iSolution: solType): solType 
} 
trait Listener1 extends Listener { 
    val modifier: Modifier 
    def onChange(iSolution: modifier.solType) = modifier.transform1(modifier.transform2(iSolution)) 
} 
+0

Ваш Listener1 зависит от типа модификатора. Вы должны сообщить своему слушателю, что тип в конструкции, который по существу эквивалентен аргументу типа. – Basilevs

Смежные вопросы