Kotlin - 如何从一个接口"覆盖"var的覆盖?

reg*_*aes 7 field kotlin

我有一个名为的界面 UserManager

interface UserManager {

    var user:User

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

和一个名为UserManagerImpl,实现的类UserManager

class UserManagerImpl : UserManager {

    override var user: User // = must provide an User object

    /* ... */
}
Run Code Online (Sandbox Code Playgroud)

这是我的问题:

如何允许其他类设置一个UserUserManager()任何时间(不提供初始User旁边的财产申报对象,并让另一个阶级创造和提供一个User实例)?

算一下吧

  1. 接口不能具有lateinit属性
  2. 我希望它User是一个非null值,所以没有可空的属性(User?)
  3. 我想使用字段访问而不是声明并在接口中使用setUser(User)getUser()方法

mfu*_*n26 10

确实,"接口不能具有lateinit属性",但这并不妨碍实现类使用它:

interface User

interface UserManager {
    var user: User
}

class UserManagerImpl : UserManager {
    lateinit override var user: User
}

fun main(args: Array<String>) {
    val userManager: UserManager = UserManagerImpl()
    userManager.user = object : User {}
    println(userManager.user)
}
Run Code Online (Sandbox Code Playgroud)

打印类似的东西LateinitKt$main$1@4b1210ee.

  • 我猜应该在编译器中对关键字的错误顺序进行更好的诊断 (2认同)