我想复制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)
}