如何实现具有多个单独公共接口的案例类?

时间:2016-05-13 13:52:56

标签: scala immutability

我尝试了什么:

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(updaters,transformers?)而不是traits看起来......错了。而且我在尝试为班级添加不同的设置器时遇到越来越多的问题。

我很欣赏这个问题的建议。

1 个答案:

答案 0 :(得分:1)

您可能不希望为您的案例类实现“setter”。我会这样做:

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)