假设我想扩展类C,得到SubC

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

以下内容不起作用,因为在printC实例上调用SubC将打印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,而不会在范围内引入新的标识符。

最佳答案

这可能是在不引入范围的新标识符的情况下用特征扩充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
  }
}

09-27 20:09