kotlin, какая функция вызывается в блоке инициализации базового класса - PullRequest
2 голосов
/ 19 июня 2020

с базовым классом и производным от него Child:

open class Base(var data: String) {

    init {
        doInit()
    }
    open protected fun doInit() {
       data += " in Base doInit()"
    }
}

class Child(data: String): Base(data) {

    init {
        doInit()
    }
    override fun doInit() {

        data += super.doInit() + " in Child doInit()"
    }
}

val obj = Child("child")

в Child ("child") вызывается init {} базы. который doInit() должен вызывать init {} Базы, из Базы или Дочернего?

1 Ответ

1 голос
/ 19 июня 2020

Если мы определим классы следующим образом:

open class Base(var data: String) {

    init {
        doInit()
    }

    protected open fun doInit() {
        data += " in Base doInit()"
        println("in Base doInit()")
    }
}

class Child(data: String): Base(data) {

    override fun doInit() {
        data += " in Child doInit()"
        println("in Child doInit()")
    }
}

и создадим дочерний объект:

val obj = Child("child")

, мы увидим результат:

в Дочерний doInit ()

Таким образом, при создании дочернего объекта и вызове функции в базовом классе, которая переопределяется в дочернем классе, вызывается дочерняя функция. Это называется полиморфизм .

...