2014-02-24 22 views
2

我要讓B的副本,但我不想重複複製的,在超(A)那張子類(B)。如何在Scala中爲子類實現DRY拷貝構造函數?

下面的解決辦法是什麼我做了。但我不喜歡它,因爲它不是一個拷貝構造函數,也因爲它處於變異狀態(無處不在)。

斯卡拉允許從主構造超直接調用,所以我不知道如何創建B拷貝構造函數不重複存在於超(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) 
} 

會打印:

hello 
(4,3) 
(4,3) 

回答

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

感謝您的回答Pihony。我想了解'B類(aVal:Int,val bVal:Int)擴展A(aVal)'的語法,你能推薦一個好的源代碼嗎?你是否碰巧知道我能在Odersky的Prog中找到解釋的地方?在斯卡拉書? – jhegedus

+0

ps。 :剛剛在「Scala for the impatient」的第8章中找到它 – jhegedus

+0

因此,不可能調用超類的複製構造函數?如果複製構造函數與複製有特殊關係。換句話說,這個(a:A)不能從這個(b:B)中調用?就像Java中的一樣。 – jhegedus