Я только начал изучать язык Котлин. Я борюсь с наследованием, var & val и побочными эффектами.
Если я объявляю признак A с val x и переопределяю x в AImpl, его можно переопределить как var (см. код ниже). Удивительно, что метод 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. Как защитить значения от изменения путем наследования?