【发布时间】:2014-02-13 09:44:55
【问题描述】:
以下代码取自这篇文章:How to create Scala swing wrapper classes with SuperMixin?
import scala.swing._
import javax.swing.JPopupMenu
class PopupMenu extends Component with SequentialContainer.Wrapper {
override lazy val peer: JPopupMenu = new JPopupMenu with SuperMixin
def show(invoker: Component, x: Int, y: Int): Unit = peer.show(invoker.peer, x, y)
}
我一直在尝试制作自定义包装器,因此需要了解这一点,这很简单,但因为 我才刚刚开始熟悉 Scala,所以我对特性有点不确定。所以我一直听到的是,traits 就像多重继承,你可以混合和匹配它们?
我绘制了一个图表,表示 PopupMenu 在整个继承结构中的位置。澄清几点:
1) 似乎从 Component 覆盖了惰性 val peer:JComponent 并且还从 SequentialContainer.Wrapper 获取了 contents 属性? (紫色文字)对吗?
2) Sequential.Wrapper 也有一个抽象的 def 对等体:JComponent.. 但这不是被覆盖的那个,所以这里根本不使用它?
3) 令人困惑的是 Component 和 Sequential.Wrapper 有一些相同的属性:它们都有 def publish 和 def subscribe(红色文本).. 但是 popupMenu 将使用的是 Component 类的订阅/发布?
4) 为什么我们不能写 PopupMenu extends SequentialContainer.Wrapper 来代替 Component?
希望这不是一次太多的问题。非常感谢您的帮助,我是 Scala 的初学者..
【问题讨论】:
标签: swing scala inheritance mixins traits