假设我想扩展课程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)
}
}
而不在范围内引入新的标识符。
答案 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)
}
}