如何将类成员传递给超类构造函数?

时间:2019-06-24 09:31:16

标签: kotlin

为什么不能将成员对象传递给超类构造函数?

这有效:


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还不存在。但是第一个示例为什么起作用?

2 个答案:

答案 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