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