我刚开始探索 Kotlin 语言。我正在为继承、var&val 和副作用而苦苦挣扎。
如果我A
用 aval x
和覆盖声明一个特征x
,AImpl
则可以将其覆盖为var
(参见下面的代码)。令人惊讶的是,即使是 in 的值,in的print()
方法A
也会受到重新分配的影响。这是错误还是功能?x
x
A
代码:
trait A {
fun print() {
println("A.x = $x")
}
val x : Int;
}
class AImpl(x : Int) : A {
override var x = x; // seems like x can be overriden as `var`
}
fun main(args: Array<String>) {
val a = AImpl(2)
a.print() // A.x = 2
a.x = 3; // x can be changed
// even though print() is defined in trait A
// where x is val it prints x = 3
a.print() // A.x = 3
}
我知道如果我明确定义a
类型A
,则不允许更改x
:
val a = AImpl(2) : A
a.x = 3 // ERROR: value x cannot be reassigned
但正如第一个案例所示,继承可能会导致副作用,这显然不是A
. 如何保护值不被继承改变?