在Scala中,如何在类的主构造函数中定义局部参数?
在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员?
例如,在下面的代码中,如何在B类的主构造函数中正确定义参数b,以便它只生成临时本地参数而不是数据成员? class A(var a: Int) class B(?b?) extends A(b) Randall,你的答案解释了当我引入一个增加属性a的方法inc时Scala编译器抱怨的原因,同时也改变了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类现在必须拥有一个私有的只读属性,因为它引用了inc.将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 添加覆盖也无济于事: 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的主构造函数中定义的属性相同的名称? 解决方法
如果从构造函数参数中删除“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 } …这里的值i仅在构造函数的执行期间存在. 但是,因为构造函数参数在方法体中引用 – 它不是构造函数体的一部分 – 构造函数参数必须复制到生成的类的(私有)字段(增加其内存需求由持有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 } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |