如何在Scala中为子类实现DRY复制构造函数?

时间:2014-02-24 18:11:18

标签: scala dry copy-constructor

我想复制B,但是我不想在超类(B)中继续重复子类(A)中的复制。

下面的解决方案是我做的。但我不喜欢它,因为它不是一个复制构造函数,因为它是变异状态(vars无处不在)。

Scala允许从主构造函数直接调用super ,因此我不知道如何为B创建复制构造函数而不重复超类中存在的复制代码({{ 1}})。

有关如何实现DRY复制构造函数或更优雅的复制方法的任何建议吗?

A

这将打印:

class A {
  var fieldA=1
  def copyFieldsInto(a:A):Unit={
    a.fieldA=fieldA
  }
}

class B extends A{
  var fieldB=2
  def copyFieldsInto(b:B):Unit=
  {
    super.copyFieldsInto(b)
    b.fieldB=fieldB
  }
}

object Test extends App{
  println("hello")
  val b=new B
  b.fieldA=3
  b.fieldB=4
  val b_copy=new B
  b.copyFieldsInto(b_copy)
  println(b.fieldB,b.fieldA)
  println(b_copy.fieldB,b_copy.fieldA)
}

1 个答案:

答案 0 :(得分:3)

如果我理解正确,那么这就是你想要的吗?

class A(val aVal: Int) {
  def this(a:A)={
    this(a.aVal)
  }
}

class B(aVal:Int, val bVal:Int) extends A(aVal){
  def this(b:B) = {
    this(b.aVal, b.bVal)
  }
}

object Test extends App{
  println("hello")                                
  val b=new B(3,4)                                
  val b_copy=new B(b)                             
  println(b.bVal,b.aVal)                          
  println(b_copy.bVal,b_copy.aVal)        
}