2010-11-19 104 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)    
    } 
} 
相关问题