以下代码报告property must be initialized or be abstract错误。

// MyApi.kt
interface MyApi {

    ...
}

// MyFetch.kt
class MyFetch {

    private val myApi: MyApi  // <- this line

    ...
}

它可以在可变变量中使用lateinit语句,但如何在val中预定义?

最佳答案

关注点分离设计模式将有利于将值传递给构造函数。因此,其他一些实例化您的MyFetch类的类也将实例化您的MyApi实例并将其传递给构造函数:

class MyClass(val myApi: MyApi){

}

//Some higher level class:
val myAPI = object: MyApi { //... }
val myClass = MyClass(myApi)

但是您也可以只在类中对其进行初始化。如果MyApi与MyClass的行为紧密相关,这将是有道理的:
class MyClass {

    val myApi = object: MyApi { //... }

}

// or

class MyClass {

    val myApi: MyApi

    init {
        myApi = object: MyApi { //... }
    }
}

在这三种情况中的任何一种情况下,都必须在构造函数中,声明中内联或val块中分配只读init属性的值。唯一的其他选择是使用属性委托(delegate)。

10-08 17:58