2014-09-01 56 views
1

是否可以添加自定義行爲來複制案例類中的函數?如何將自定義行爲添加到Scala的case類中複製函數?

事情是這樣的:

case class User (version: Integer) { //other fields are omitted 
    //something like this 
    override def copy (...) { 
     return copy(version = version + 1, ...) 
    } 
} 

所以我不希望重寫複印功能,只需添加增加版本字段和複製等。我怎樣才能做到這一點?

+0

這樣的事情更適合我的伴侶對象。 – cchantep 2014-09-01 08:11:28

回答

3

添加行爲,如複印基本功能是不是一個好主意。功能方法是讓數據僅僅是數據,並且在從外部對數據進行操作的函數中具有行爲。

但如果你真的想這樣做,你將不得不重新實現複製方法,像這樣:

case class User(name:String, age:Int, version:Int = 0) { 
    def copy(name:String = this.name, age:Int = this.age) = User(name,age,version+1) 
} 

用法:

scala> User("John Doe", 25).copy(age = 26) 
res4: User = User(John Doe,26,1)  

但要注意,你可能必須重新實施一些其他方法以及有用的行爲。例如,您可能不希望人們在構建用戶時能夠傳遞一個版本。所以你需要將構造函數設爲private並添加一個apply方法。

你也可能不希望被視爲平等的版本字段。所以你必須重新定義equals和hashCode來省略版本字段。所以既然你已經重新定義了一個case類給你的幾乎所有的東西,你也可以讓這個類成爲一個正常的非案例類。

一般來說,我認爲case類應該用於純數據,而混合的數據和邏輯更多的面向對象類是最好的,因爲正常的類做,即使這意味着更多的輸入。

+0

在這我必須複製任何新的案例類參數複製功能。有沒有這樣的解決方案:'def copy(parameters:_)= User(parameters,version + 1)'?目前我不得不向User函數顯式添加參數。 – Cherry 2014-09-01 08:18:20

+0

不是我所知道的。如果你只需要這個,我只接受樣板。 – 2014-09-01 08:39:40

+0

@Cherry u wod hav 2使用宏 – samthebest 2014-09-02 14:08:53

相關問題