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{}
之前调用