假设我想扩展类C
,得到SubC
。
现在,我想访问c
中的变量SubC
,如下面示例中的方法printC
所示。
以下内容不起作用,因为在printC
实例上调用SubC
将打印SubC
的c
而不是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
}
}
可能的(但不理想的)解决方案是:
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
}
}