2010-11-19 101 views
2

假設我想擴展類C,得到SubC在Scala中調用超類構造函數的正確方法是什麼?

現在我想訪問SubC中的變量c,如以下示例中的方法printC中所示。

下不能正常工作,如在SubC實例調用printC將打印SubCc而不是Cc(我想我可能已經選擇更好的名字......)

class C(protected var c : Int) { 
    def update(n : Int) { 
    c = n 
    } 
} 

class SubC(c: Int) extends C(c) { 
    def printC : Unit = { 
    println(c) 
    } 
} 

object Main { 
    def main(args: Array[String]) { 
    val subC = new SubC(1) 
    subC.update(3) 
    subC.printC // prints 1 
    } 
} 

一可能(但不期望的)的解決辦法是:

class SubC(cc: Int) extends C(cc) { 
    def printC = { 
    println(c) 
    } 
} 

這工作,但它引入了一個新的(不需要的)標識符cc進入範圍。

有沒有更好的(更清潔)的方式來做到這一點? PS:把上面的例子放到一些上下文中。我實際上想要做的是增加C的某些特徵,而不是將新的標識符引入範圍。

回答

9

這可能是增加與性狀C,無範圍引入新的標識符的最好方法:

class C(protected var c : Int) { 
    def update(n : Int) { 
    c = n 
    } 
} 

trait CanPrintC { 
    self: C => 
    def printC : Unit = { 
     println(c) 
    } 
} 
class SubC(c: Int) extends C(c) with CanPrintC 

object Main { 
    def main(args: Array[String]) { 
    val subC = new SubC(1) 
    subC.update(3) 
    subC.printC // prints 3 
    } 
} 
+0

尼斯思維......這種解決方案的問題它創建CanPrintC和C之間的依賴關係......我可能有不同包中的幾個特徵,併爲它們中的每一個創建包裝,好像很多代碼會被重複。 – dankilman 2010-11-19 17:39:24

+0

好吧..對不起。良好的解決方案。起初我誤解了它。 – dankilman 2010-11-19 17:49:31

2

使用自給類型:

class SubC(c: Int) extends C(c) { 
    self: C => 
    def printC : Unit = {    
    println(self.c)    
    } 
} 
相關問題