目前,我正在研究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
发布于 2018-09-17 21:09:15
您只初始化Base一次。
由于这个原因,您也只初始化size一次。
因此,您将只执行also块一次。
或者,为了以不同的方式回答您的问题,它不会第二次打印Initializing size in Base,因为它不会第二次执行name.length.also { println("Initializing size in Base: $it") }。
https://stackoverflow.com/questions/52373783
复制相似问题