В настоящее время я работаю над документами Kotlin для этого раздела, где они охватывают Порядок инициализации производного класса .
Для следующего фрагмента ...
open class Base(val name: String) {
init { println("Initializing Base") }
open val size: Int = name.length.also { println("Initializing size in Base: $it") }
}
class Derived(
name: String,
val lastName: String
) : Base(name.capitalize().also { println("Argument for Base: $it") }) {
init { println("Initializing Derived") }
override val size: Int =
(super.size + lastName.length).also { println("Initializing size in Derived: $it") }
}
fun main(args: Array<String>) {
println("Constructing Derived(\"hello\", \"world\")")
val d = Derived("hello", "world")
}
при выполнении он печатает это:
Constructing Derived("hello", "world")
Argument for Base: Hello
Initializing Base
Initializing size in Base: 5
Initializing Derived
Initializing size in Derived: 10
У меня вопрос, почему, когда override val size: Int = (super.size + lastName.length).also { println("Initializing size in Derived: $it") }
выполняется, не печатает ли Initializing size in Base: 5
снова?
Я бы подумал, что это напечатает что-то вроде этого:
Constructing Derived("hello", "world")
Argument for Base: Hello
Initializing Base
Initializing size in Base: 5
Initializing Derived
Initializing size in Base: 5 // Print because .also is called again ?
Initializing size in Derived: 10