【发布时间】:2009-12-11 17:09:13
【问题描述】:
在 Scala 中,如何在非数据成员的类的主构造函数中定义局部参数,例如,该参数仅用于初始化基类中的数据成员?
例如,在下面的代码中,如何在类B的主构造函数中正确定义参数b,使其只生成临时局部参数而不生成数据成员?
class A(var a: Int)
class B(?b?) extends A(b)
Randall,你的回答解释了为什么 Scala 编译器在我引入一个增加属性 a 的方法 inc 时会抱怨,而且还更改了类 B 构造函数中的参数名称以匹配参数的名称在类A构造函数中:
class A(var a: Int)
class B(a: Int) extends A(a) {
def inc(value: Int) { this.a += value }
}
Scala 编译器输出:
$ scala construct.scala
construct.scala:3: error: reassignment to val
def inc(value: Int) { this.a += value }
^
one error found
Scala 抱怨是因为类B 现在必须有一个私有的只读属性a,因为在inc 中引用了a。将B(a: Int) 更改为B(var a: Int) 会产生不同的编译器错误:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a needs `override' modifier
class B(var a: Int) extends A(a) {
^
one error found
添加override 也无济于事:
construct.scala:2: error: error overriding variable a in class A of type Int;
variable a cannot override a mutable variable
class B(override var a: Int) extends A(a) {
^
one error found
如何在B的主构造函数中的参数中使用与基类A的主构造函数中定义的属性相同的名称?
【问题讨论】:
标签: scala constructor