【发布时间】:2014-05-14 06:29:43
【问题描述】:
我刚刚开始探索 Kotlin 语言。我正在为继承、var&val 和副作用而苦苦挣扎。
如果我用val x 声明一个特征A 并在AImpl 中覆盖x,则可以将其覆盖为var(参见下面的代码)。令人惊讶的是,A 中的print() 方法会受到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 中显然不打算出现的副作用。如何保护值不被继承更改?
【问题讨论】:
标签: inheritance side-effects kotlin