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



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

下面的解决方案是我煮的。但我不喜欢它,因为它不是复制构造函数,因为它是变异状态(到处都是变量)。

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

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

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)
}

这将打印:

hello 
(4,3) 
(4,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)        
}

最新更新