open class OpenBase(open val value: Int)
interface AnotherExample {
val anotherValue: OpenBase
}
open class OpenChild(value: Int) : OpenBase(value), AnotherExample {
override var value: Int = 1000
get() = field - 7
override val anotherValue: OpenBase = OpenBase(value)
}
open class AnotherChild(value: Int) : OpenChild(value) {
final override var value: Int = value
get() = field
set(value) { field = value * 2 }
final override val anotherValue: OpenChild = OpenChild(value)
}
fun main() {
val openChild = OpenChild(42)
println("OpenChild value: ${openChild.value}")
println("OpenChild anotherValue: ${openChild.anotherValue.value}")
val anotherChild = AnotherChild(42)
println("AnotherChild value: ${anotherChild.value}")
println("AnotherChild anotherValue: ${anotherChild.anotherValue.value}")
anotherChild.value=69 //HERE
println("AnotherChild value: ${anotherChild.value}")
println("AnotherChild anotherValue: ${anotherChild.anotherValue.value}")
}
I was learning kotlin OOPS and was playing with an example; I was expecting an error but got no error. Why am I able to modify the value mentioned final?
The
finalinfinal override var valueonly means that the property can't be overridden in other subclasses. If wantvalueto be read only inAnotherChild, you must declare it asvalinstead ofvar. Or, if you do need a private setter, declare it asvarbut addprivatetoset.In the context of class members,
valsimply means "property with a getter", andvarmeans "property with a getter and a setter. The latter is a valid override for the former, which is what you are doing inAnotherChild`.