Tôi vừa mới bắt đầu khám phá ngôn ngữ Kotlin. Tôi đang đấu tranh với thừa kế, var & val và tác dụng phụ.Lỗi hoặc tính năng: Kotlin cho phép thay đổi 'val' thành 'var' trong thừa kế
Nếu tôi tuyên bố một đặc điểm A
với một val x
và ghi đè x
trong AImpl
nó có thể ghi đè lên nó như var
(xem mã bên dưới). Ngạc nhiên là phương pháp print()
trong A
bị ảnh hưởng bởi việc gán lại x
mặc dù x
là một giá trị trong A
. Đây có phải là một lỗi hoặc một tính năng?
Code:
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
}
Tôi nhận thức được thực tế rằng nếu tôi xác định a
với loại A
rõ ràng nó không được phép thay đổi x
:
val a = AImpl(2) : A
a.x = 3 // ERROR: value x cannot be reassigned
Nhưng như trường hợp chương trình đầu tiên , thừa kế có thể gây ra các tác dụng phụ rõ ràng không được dự định trong A
. Làm cách nào để bảo vệ các giá trị không bị thay đổi bởi kế thừa?