2016-05-13 75 views
1

我試了一下:如何實現一個具有多個獨立公共接口的案例類?

object LolTest { 
    trait Foo { 
     def foo: Int // getter 
     def foo(i: Int): Foo // setter 
    } 

    trait Bar { 
     def bar: String // getter 
     def bar(s: String): Bar // setter 
    } 

    case class Buzz(foo: Int, bar: String) extends Foo with Bar { 
     override def foo(i: Int): Buzz = copy(foo = i) 
     override def bar(s: String): Buzz = copy(bar = s) 
    } 
} 

但我真正的類應該有很多領域(約10)。不得不在特定的類中實現setter(更新者,變換器?)而不是特性看起來......錯了。而且我越來越多的問題試圖爲班級添加不同的設置者。

我會很感激這個問題的建議。

+2

爲什麼不直接使用的情況下,類與十個字段? https://github.com/alexandru/scala-best-practices/blob/master/sections/2-language-rules.md#24-should-not-define-useless-traits – leshkin

+0

@leshkin:封裝不同的「意見「由不同用戶的班級。 「程序接口」等等。 –

回答

1

你可能不想爲你的案例類實現「setters」。我會這樣做:

scala> case class A(a: Int, b: String = "hi", c: Boolean = false) 
defined class A 

scala> A(1) 
res0: A = A(1,hi,false) 

scala> A(1, "bye") 
res1: A = A(1,bye,false) 

scala> A(1, "bye", true) 
res2: A = A(1,bye,true) 

scala> res2.copy(b = "actually hi") 
res3: A = A(1,actually hi,true) 

在這個例子中a是必需的。如果你想要一個例子,你可以構造一個A唯一指定b,你的情況類定義給出了a默認值:

scala> case class A(a: Int = 1, b: String = "hi", c: Boolean = false) 
defined class A 

scala> A(b = "only change the middle") 
res9: A = A(1,only change the middle,false) 
相關問題