加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

在Scala中,如何在类的主构造函数中定义局部参数?

发布时间:2020-12-16 09:25:56 所属栏目:安全 来源:网络整理
导读:在Scala中,如何在不是数据成员的类的主构造函数中定义局部参数,例如,仅用于初始化基类中的数据成员? 例如,在下面的代码中,如何在B类的主构造函数中正确定义参数b,以便它只生成临时本地参数而不是数据成员? class A(var a: Int)class B(?b?) extends A(b) R
在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
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读