2010-05-26 67 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