在Scala中调用超类构造函数的正确方法是什么?
问题描述:
假设我想扩展类C
,得到SubC
。在Scala中调用超类构造函数的正确方法是什么?
现在我想访问SubC
中的变量c
,如以下示例中的方法printC
中所示。
下不能正常工作,如在SubC
实例调用printC
将打印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
}
}
答
使用自给类型:
class SubC(c: Int) extends C(c) {
self: C =>
def printC : Unit = {
println(self.c)
}
}
尼斯思维......这种解决方案的问题它创建CanPrintC和C之间的依赖关系......我可能有不同包中的几个特征,并为它们中的每一个创建包装,好像很多代码会被重复。 – dankilman 2010-11-19 17:39:24
好吧..对不起。良好的解决方案。起初我误解了它。 – dankilman 2010-11-19 17:49:31