i want test number of stackable traits extend such 1 this:
trait layer{ def write(s:string): string } each 1 process incoming string somehow , passes next layer, example:
trait timestamplayer { abstract override def write(s:string) = system.nanotime + super.write(s) } my idea write base test class whith such fixture:
abstract layertest { type l val layer = new baselayer l // baselayer 1 nothing } where each test subclass overwrite l such stackable trait. of course doesn't work, since there's no constraint on l specify it's trait. quoting compiler,
type l needs trait mixed in
i thought of like
abstract layertest[l <: layer] { //... } class timestamplayertest extends layertest[timestamplayer] {} but can't constrain l trait, or @ least don't know how to
is there way specify type trait?
the problem code more fundamental missing type constrait on l specify it's trait. if that, should compiler do? when using new operator, type must known, here l abstract type new baselayer l entirely unknown @ point of call new. there no way compiler know here.
what should make layer abstract, , let concrete sub-classes perform instantation.
trait layer{ def write(s: string): string } trait timestamplayer extends layer{ abstract override def write(s: string) = system.nanotime + super.write(s) } trait baselayer extends layer { def write(s: string) = s } abstract class layertest { type l <: layer val layer: l // note abstract } class mytest extends layertest { class l extends baselayer timestamplayer val layer = new l // instantiate here in conrete test } note ease pain i've used fact can directly implement abstract type concrete class of same name (class l extends ...)
Comments
Post a Comment