Я только начал изучать язык Котлин. Я борюсь с наследованием, 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
. Как защитить значения от изменения путем наследования?