scala - How to abstract from type of immutable value performing its transformations? -
i want incapsulate real type of immutable solution object in implementation of modifier can’t find way avoid downcasts. how can write listeners independent on type of solution without making them have type parameter?
the following code illustrates downcasts unvoidable if listener unaware concrete type of solution.
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 avoided in implementations of these def transfrom2(isolution: solution): solution } class listener1 extends listener { //should independent solution concrete type. current implentation meets requirement introducing downcasts in modifier. val modifier: modifier def onchange(isolution: solution) = modifier.transform1(modifier.transform2(isolution)) // action involving solution transformations modifier }
one possible answer in question - can use abstract types.
here example may you:
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)) }
Comments
Post a Comment