为什么不能将成员对象传递给超类构造函数?
这有效:
class Foo(private val whatever : Object = Object()) : BaseClass(whatever) {
fun someFunction() {
// Do something with "whatever"
println(whatever.toString())
}
}
但这不是:
class Foo() : BaseClass(whatever) {
private val whatever = Object()
fun someFunction() {
// Do something with "whatever"
println(whatever.toString())
}
}
在第二个示例中,成员whatever
无法传递给基类。这是有道理的,因为子类是在基类之后初始化的,并且此时whatever
还不存在。但是第一个示例为什么起作用?
答案 0 :(得分:0)
在创建另一个类的子类时,可以调用这些类的构造函数,例如BaseClass(whatever)
。在这种情况下,whatever
对象需要在这些子类的主要构造函数中作为参数创建/传递。
在kotlin中,除了在类内部创建属性外,还可以使用var / val在主构造函数中将其定义为参数。像class Foo(val whatever : Object)
但是,它仅在主构造函数上。
答案 1 :(得分:0)
问题出在Initialization Order。
第一个示例有效,因为BaseClass
的构造函数的参数是Foo
的构造函数的参数。没有问题。争论刚刚通过。
第二个示例不起作用,因为在初始化BaseClass
的{{1}}属性之前,首先需要调用Foo
的构造函数。
编辑:
如果您确实需要在whatever
内初始化whatever
,则可以使用Companion Object。
Foo