kotlin,在基类';s初始块

kotlin,在基类';s初始块,kotlin,inheritance,Kotlin,Inheritance,具有基类及其派生的子类: 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

具有基类及其派生的子类:

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{}。基的init{}应该从基的或子的调用哪个
doInit()

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")
我们将看到输出:

在Child doInit()中


因此,当创建子对象并调用基类中在子类中重写的函数时,将调用子对象的函数。这就被调用了。

首先,函数不能被重写,类不能被扩展,直到它被标记为
open
,其次,您将从super返回的
Unit
与字符串连接起来,这是不可能的,因为没有为Unit类定义加号运算符。这可能有助于基类的init{}是在子实例完成创建之前调用的(是吗?),它是否具有可以调用的子覆盖函数?如果在子类中也有init{},似乎只有在调用它之后,覆盖函数才准备好。如果我们还向基类和子类的
init{}
添加日志,我们将看到下一个打印序列:1。基初始化{}2。在Child doInit()中。子初始化{}。你的问题的答案是肯定的
如果在child中也有init{},似乎只有在调用它之后,覆盖函数才准备好。
-我不知道你所说的
ready
是什么意思,但正如我们看到的,child的覆盖函数可以在
init{}
之前调用