Intereting Posts
Разумные ситуации для использования `Let` Котлина Как преобразовать вывод функции в Unit с Kotlin Есть ли еще более простой способ выражения анонимных классов в Котлине? Как сравнить класс <*> с примитивным типом Java в коробке без предупреждений компилятора kotlin Изменить текучесть <Список <Obj1 >> в текущую <Список <Obj2 >> в комнате Разница между типами List и Array в Котлине Использование FirebaseListAdapter в Котлине Почему Котлин не выполняет автоматическое литье под давлением? Динамический бросок в Котлине Почему не вызывается onConfigurationChanged? Имущество должно быть инициализировано или быть абстрактным Как разрешить неоднозначность перегрузки в ссылках на методы? Как написать общий метод расширения в Котлине? Почему Котлин не позволяет использовать lateinit с примитивными типами? Передача параметров пользовательскому получателю в котлин

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 .