【发布时间】:2021-07-11 08:23:55
【问题描述】:
这意味着,在基类构造函数执行时,派生类中声明或覆盖的属性尚未初始化。如果在基类初始化逻辑中使用了这些属性中的任何一个(直接或间接地,通过另一个覆盖的开放成员实现),则可能导致不正确的行为或运行时故障。因此,在设计基类时,应避免在构造函数、属性初始化程序和 init 块中使用开放成员。
我正在从 Kotlin 文档中学习继承,但我被困在这里。有另一个帖子问了一个关于这个的问题,但答案只是文档以不同的方式说的。
- 说清楚,我理解构造函数和继承之间的数据流。我无法理解的是我们如何在基类初始化中使用被覆盖的属性。它说
可能直接或间接发生
这实际上是什么意思?基类如何能以某种方式访问派生类中被覆盖的属性?
- 另外,它说
因此,您应该避免在构造函数中使用开放成员, 属性初始化器和初始化块。
那么我们如何正确使用开放属性呢?
编辑评论:
fun main ()
{
val d = Derived("Test2")
}
open class Base()
{
open val something:String = "Test1"
init
{
println(something) //prints null
}
}
class Derived(override val something: String): Base()
【问题讨论】:
标签: kotlin