在不更改字段的情况下覆盖case对象中的方法

时间:2014-06-16 09:20:37

标签: scala case-class method-overriding

case class A(a:Int, b:Int) {
  def f(){println(a)}
}
val o1 = A(3,3)

val o2 = new A(o1.a,o1.b) {override def f(){println(b)}}  //too long when there are a lot of parameters

这里我必须将o1参数传递给o2,但在现实生活中我有更多的参数。我知道我可以像这样复制案例对象

 o2 = o1.copy

有没有办法将副本与重写方法结合起来?

1 个答案:

答案 0 :(得分:1)

不确定是否有一种简单的方法可以将copy与重写相结合。但是作为替代方案,您可以考虑重载案例类构造函数(以获取案例类对象),如下所示:

case class A(x: Int, y: String) {

  def this(a : A) = this(a.x, a.y)

  def f() { println(x)}
}

然后,您可以通过仅传递1个参数来创建A个对象实例(具有覆盖):

val o1 = A(30, "Test")
val o2 = new A(o1) { override def f() { println(y)} }

显然,这并不能完全解决长参数问题,因为您在定义构造函数时仍需要列出它们。虽然如果你在具有不同行为的多个A对象之后,那么每次指定完整列表应该是一个很大的改进。