gpt4 book ai didi

scala - 覆盖继承的构造函数字段时的差异?

转载 作者:行者123 更新时间:2023-12-04 11:29:37 25 4
gpt4 key购买 nike

考虑这个简单的 Scala 类:

class A(val d: Int)

Scala(行为或生成的字节码)之间是否存在差异
class B(d: Int) extends A(d)


class B(override val d: Int) extends A(d)

或者两者都是等价的?如果它们不同,它们各自的具体用例是什么?

如果 A 会不一样吗?被定义为 class A(var d: Int) ?

最佳答案

对于 vals,没有语义差异。但是,生成的字节码可能存在差异。特别是,如果派生类中定义的方法引用 d ,它指的是构造函数参数d而不是 val同名。这是通过为派生类生成的附加私有(private)字段实现的。

对于 vars,有一个 行为差异 .如果没有覆盖,任何引用 d 的方法派生类中的将引用构造函数参数,而调用者引用 d从类外将获得该领域。在这种情况下,这两个值可能不同(如果该值自构造以来已更改)。

这是一个使用 var 演示行为的 session :

scala> class A(var d: Int)
defined class A

scala> class B(d: Int) extends A(d) { override def toString = "d: " + d }
defined class B

scala> val b = new B(1)
b: B = d: 1

scala> b.d = 2

scala> b.d
res1: Int = 2

scala> b
res2: B = d: 1

这个问题是相关的: Idiomatic Scala way to deal with base vs derived class field names? .

关于scala - 覆盖继承的构造函数字段时的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6657248/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com