在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员?
例如,在下面的代码中,如何b在类的主构造函数中正确定义参数,B以便它只生成临时本地参数而不是数据成员?
class A(var a: Int)
class B(?b?) extends A(b)
Run Code Online (Sandbox Code Playgroud)
Randall,你的答案解释了当我引入一个inc增加属性的方法时Scala编译器抱怨的原因a,但是也改变了类B构造函数中参数的名称以匹配类构造函数中参数的名称A:
class A(var a: Int)
class B(a: Int) extends A(a) {
def inc(value: Int) { this.a += value }
}
Run Code Online (Sandbox Code Playgroud)
Scala编译器输出:
$ scala construct.scala
construct.scala:3: error: reassignment to val
def inc(value: Int) { this.a += value }
^
one error found
Run Code Online (Sandbox Code Playgroud)
Scala抱怨因为引用in 而类B必须现在具有私有的只读属性.更改以生成不同的编译器错误:aaincB(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
Run Code Online (Sandbox Code Playgroud)
添加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
Run Code Online (Sandbox Code Playgroud)
如何在主构造函数的参数中使用B与基类主构造函数中定义的属性相同的名称A?
Ran*_*ulz 16
如果从构造函数参数中删除"var"或"val"关键字,则它不会生成属性.
但请注意,非var,非val构造函数参数是范围内的,并且可在整个类中访问.如果在非构造函数代码中使用一个代码(即,在方法体中),则生成的类中将存在一个隐藏该构造函数参数的不可见私有字段,就像您将其设置为"private var"或" private val"构造函数参数.
附录(迟到总比没有好)?
在此代码中,构造函数参数的引用仅在构造函数体中发生:
class C1(i: Int) {
val iSquared = i * i
val iCubed = iSquared * i
val iEven = i - i % 2
}
Run Code Online (Sandbox Code Playgroud)
...这里的值i仅在构造函数执行期间存在.
但是,在下面的代码中,因为构造函数参数在方法体中引用 - 它不是构造函数体的一部分 - 构造函数参数必须复制到生成的类的(私有)字段(增加其内存需求由保持a Int)所需的4个字节:
class C2(i: Int) {
val iSquared = i * i
val iCubed = iSquared * i
val iEven = i - i % 2
def mod(d: Int) = i % d
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2075 次 |
| 最近记录: |