在Scala中调用超类构造函数的正确方法是什么?

时间:2010-11-19 16:30:57

标签: inheritance scala

假设我想扩展课程C,获取SubC

现在,我想访问c中的变量SubC,如下面示例printC中所示。

以下内容不起作用,因为在printC个实例上调用SubC会打印SubC的{​​{1}}而非c的{​​{1} (我想我可以选择更好的名字......)

C

可能的(但不合需要的)解决方案是:

c

这有效,但它将新的(和不需要的)标识符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 } } 引入范围。

有更好(更清洁)的方法吗?

PS:将上面的例子放到某个上下文中。我实际想要做的是用一些特征来增加class SubC(cc: Int) extends C(cc) { def printC = { println(c) } } 而不在范围内引入新的标识符。

2 个答案:

答案 0 :(得分: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
  }
}

答案 1 :(得分:2)

使用自我类型:

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