我刚刚开始探索 Kotlin 语言。我正在为继承、var&val 和副作用而苦苦挣扎。
如果我用 val x
声明一个特征 MỘT
并在 AImpl
中覆盖 x
,则可以将其覆盖为 của chúng tôi
(参见下面的代码)。令人惊讶的是, MỘT
TRONG print()
方法会受到 x
重新分配的影响,即使 x
ĐúngMỘT
。这是错误还是功能?
Mã số:
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) {
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
}
我知道如果我明确定义 Một
类型为 MỘT
则不允许更改 x
:
val a = AImpl(2) : A
a.x = 3 // ERROR: value x cannot be reassigned
但正如第一种情况所示,继承可能会导致副作用,这在 MỘT
中显然不是有意的。如何保护值不被继承更改?
您可以使您的 giá trị
cuối cùng
,即完全禁止覆盖它。如果你在一个类中定义了一个giá trị
,它默认是cuối cùng
。
另外,如果你需要用 của chúng tôi
覆盖 giá trị
,但不希望 setter 公开,你可以这样说:
override var x = 1
private set
sử dụng của chúng tôi
覆盖 giá trị
是一项功能。这相当于添加了一个 set-method,而在父类(super class)中只有一个 get-method。这对于实现一些模式(例如只读接口(interface))相当重要。
除了将其设为 cuối cùng
之外,没有办法“保护”你的 giá trị
不被覆盖,因为 giá trị
> 并不意味着“不可变引用”,而仅仅是“只读属性”。换句话说,当你的 trait MỘT
声明一个 giá trị
时,这意味着 通过一个 MỘT
类型的引用客户端无法编写此 giá trị
,没有其他保证,或者确实可能。
附:分号在 Kotlin 中是可选的,可以完全省略它们
Tôi là một lập trình viên xuất sắc, rất giỏi!