我想在特征的类型字段中添加约束,因为其他特征混合在一起,但似乎无法找到表达它的方法。任何帮助表示赞赏:
collectionview.frame.size.width
编译说:
trait Events { def be() = println("B") }
trait Create { self : Events => def create() = println("C") }
trait Update { self : Events => def update() = println("U") }
trait Delete { self : Events => def delete() = println("D") }
trait EventHandler {
type MyEvents <: Events
val myEvents : MyEvents
}
trait Creation {
self: EventHandler =>
override type MyEvents <: Create
}
def h(events: EventHandler with Creation) : Unit = {
events.myEvents.be() // <== wont' compile
events.myEvents.create()
}
答案 0 :(得分:0)
好吧我以前的一些评论是错误的,我没有意识到自我键入隐藏了你正在使用的界面,因此与“扩展”不一样。这是一个更好地解释它的链接:
http://www.andrewrollins.com/2014/08/07/scala-cake-pattern-self-type-annotations-vs-inheritance/
这会在您的代码中产生太多的逻辑冲突,因此我不会尝试在此处重做。您的代码中的这些冲突归结为此 - 您的一些逻辑是打开特征API,然后您的一些自我类型会立即隐藏它们。这是一个帮助我理解原因的例子
trait A {
def x:Int
}
trait B { self:A =>
}
def workWithB(b:B): Unit ={
b.x //wont' compile, is forced hidden.
}