Kotlin – Как «запоздать» var переопределил интерфейс?

У меня есть интерфейс UserManager

 interface UserManager { var user:User /* ... */ } 

и класс UserManagerImpl , который реализует UserManager

 class UserManagerImpl : UserManager { override var user: User // = must provide an User object /* ... */ } 

Вот моя проблема:

Как разрешить другому классу устанавливать User в UserManager() в любое время ( т. UserManager() Не предоставлять начальный объект User вместе с объявлением свойства и разрешить другому классу создавать и предоставлять экземпляр User )?

Примите во внимание, что

  1. Интерфейсы не могут иметь свойства lateinit
  2. Я хочу, чтобы User был непустым значением, поэтому свойство nullable ( User? )
  3. Я хочу использовать полевой доступ вместо объявления и использовать setUser(User) и getUser() в интерфейсе

Solutions Collecting From Web of "Kotlin – Как «запоздать» var переопределил интерфейс?"

Верно, что «интерфейсы не могут иметь свойства 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) } 

Печатает что-то вроде LateinitKt$main$1@4b1210ee .