Порядок инициализации производного класса - PullRequest
0 голосов
/ 17 сентября 2018

В настоящее время я работаю над документами 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

1 Ответ

0 голосов
/ 18 сентября 2018

Вы инициализируете Base только один раз.
По этой причине вы также инициализируете size только один раз.
По этой причине вы выполняете свой блок also только один раз.

Или, чтобы ответить на ваш вопрос по-другому, он не печатает Initializing size in Base во второй раз, потому что он не выполняется name.length.also { println("Initializing size in Base: $it") } во второй раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...