是否有可能混入:附加类型约束

时间:2016-02-08 23:39:12

标签: scala

我想在特征的类型字段中添加约束,因为其他特征混合在一起,但似乎无法找到表达它的方法。任何帮助表示赞赏:

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()
}

1 个答案:

答案 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.
  }