2016-04-20 26 views
3

我有一個名爲UserManagerKotlin - 如何從一個接口「延遲」一個var overrided?

interface UserManager { 

    var user:User 

    /* ... */ 
} 

一個接口和一個叫UserManagerImpl類,實現了UserManager

class UserManagerImpl : UserManager { 

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

    /* ... */ 
} 

這裏是我的問題:

如何允許其他類設置在User 在任何時間(不提供初始User對象與屬性聲明並讓另一個類創建並提供User實例)?

採取計數

  1. 接口不能有lateinit性能
  2. 我想User是一個非空值,所以沒有可空屬性(User?
  3. 我想使用字段訪問而不是申報,並在接口中使用setUser(User)getUser()方法

回答

6

這是事實,「接口不能有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) 
} 

打印像[email protected]

+0

優秀@ mfulton26!我試圖使用覆蓋lateinit var user:User'而不是你的方法。 :) – regmoraes

+0

我想在編譯器應該有一個更好的診斷錯誤的關鍵字順序 – voddan