在 Scala 中调用超类构造函数的正确方法是什么?
假设我想扩展类 C
,获得 SubC
。
现在我想访问 SubC
中的变量 c
,如下面方法 printC
中的示例所示。
以下内容不起作用,因为在 SubC
实例上调用 printC
将打印 SubC
的 c
而不是 < code>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
,而不在作用域中引入新的标识符。
Suppose I would like to extend class C
, getting SubC
.
Now I would like to access the variable c
in SubC
as presented in the example below in the method printC
.
The following does not work, as calling printC
on a SubC
instance will print SubC
's c
and not C
's c
(I guess I could have picked better names...)
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
}
}
A possible (but undesirable) solution would be:
class SubC(cc: Int) extends C(cc) {
def printC = {
println(c)
}
}
This works but it introduces a new (and unneeded) identifier cc
into scope.
Is there a better (cleaner) way of doing this?
PS: To put the example above into some context. What I actually want to do is to augment C
with some traits without introducing new identifiers into scope.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
这可能是在不引入新标识符的情况下用特征增强 C 的最佳方法:
This is probably the best way to augment C with traits without introducing new identifiers in scope:
使用自我类型:
Use self types: