2016-03-18 57 views
1

给定一个超类或特征,并假定一个开放的层次结构,我如何强制所有的扩展类实现一个特定的类型类?强制所有的子类实现给定的类型类

例如,假设类型类Default

trait Default[T] { def default: T } 

和一些性状Super

trait Super { } 

我想执行下列(本身)是不允许的:

class A(val i: Int) extends Super 

...虽然以下是:

class B(val i: Int) extends Super 
implicit val bHasDef = new Default[B] { def default = B(42) } 

假设以上是可能的,那么我可以从Super中的方法访问子类型的类型证据吗?即,是这样的:

trait Super { 
    def magic: Default[this.type] = ??? 
} 

回答

0

我几乎认为你可以强制执行,至少在一个很简单的方法,也许这是可能的东西,如无形的更复杂。

我会做的是添加一些修改超级特质,使其采取自参考Default

trait Default[T] { def default: T } 

trait Super[T] { 
    self: Default[T] => 
} 

class B(val i: Int) extends Super[Int] with Default[Int] { 
    override def default: Int = ??? 
} 

class A(val i: Int) extends Super[Int] // doesn't compile, needs a Default 

这也应该解决你问题的第二部分,其缺点是,现在一个特质捆绑到另一个。

相关问题