2010-05-26 61 views
1

我是Martin Fowler's(不推荐)模型 - 视图 - 演示者模式的粉丝。我正在写一个包含几个按钮类的Scala视图类。我想包括设置按钮的动作属性的方法,由演示者调用。典型的代码片段如下所示:Scala model-view-presenter,traits

private val aButton = new JButton 
def setAButtonAction(action: Action): Unit = { aButton.setAction(action) } 

此代码对每个按钮都重复执行。如果Java/Scala有C预处理器,我会创建一个宏来生成这个代码,给定按钮名称(请不要在C预处​​理器的邪恶课上讲课)。这段代码显然非常冗长和重复。有没有更好的方式来在Scala中做到这一点,也许使用特征?

请举办关于scala.swing的讲座。我在这里寻找一个普遍的模式。

回答

4

对于显式的setter和getter方法,Scala不如java。而是使用抽象字段来定义公开的接口。怎么样是这样的:

trait ActionUser { 
    def setAction(action:Action):Unit 
} 

trait Container { 
    val aButton:ActionUser 
} 

trait ContainerImpl { 
    val aButton = new JButton with ActionUser 
} 

类对Container操作将只能访问setAction而内部方法把它看作一个JButton。

还有一点注意:C使用宏来减少代码重复。 Scala使用特征的多重继承来完成同样的事情。

+0

不错的答案。我将进一步探讨这一点。 – Ralph 2010-05-26 17:54:23

+0

@Ralph你有没有探索过它?你可以在Scala中分享MVP的骨架代码吗?我问这个问题与赏金值得,请检查它:http://stackoverflow.com/questions/17631080/mvp-in-scala-swing – MyTitle 2013-07-20 11:33:28

+0

@MyTitle:我开始了一个项目探索了这一点,但不得不继续前进到另一个项目,永远不会回来。如果我必须这样做,我会用sblundy的答案中显示的模式。 – Ralph 2013-07-20 13:18:36