Делегация класса Колтина, передавая это делегату

Есть ли возможность передать this при делегировании класса в котлин?

 class SomeFlow : Flow, SmsAuthentication by DefaultSmsAuthentication(this) 

Он говорит, что this не существует в этом контексте. Другой класс выглядит следующим образом:

 class DefaultSmsAuthentication(val flow: Flow) : SmsAuthentication 

Как насчет инъекции this установщиком, а не constructor ?

Например:

 interface SmsAuthentication { fun withFlow(flow: Flow) fun auth() } class DefaultSmsAuthentication() : SmsAuthentication { var flow: Flow? = null override fun withFlow(flow: Flow) { this.flow = flow } override fun auth() { flow?.proceed() } } class SomeFlow : Flow, SmsAuthentication by DefaultSmsAuthentication() { init { withFlow(this) } } 

Тем не менее, вам нужно каждый раз вызывать withFlow() в constructor вручную. Вы можете забыть позвонить ему.

Возможно, вы захотите иметь SmsAuthentication как свойство. Поэтому вы просто вводите его by lazy и называете это нужным. Я думаю, что это безопаснее.

 class SomeFlow : Flow, SmsAuthentication { val auth by lazy { DefaultSmsAuthentication(this) } override fun auth() { auth.auth() } } 

Вы также можете применить шаблон Decorator, наоборот:

 class DefaultSmsAuthenticationFlow(val flow: Flow) : SmsAuthentication, Flow by flow { override fun auth() { // you can use flow as this here } } fun doAuth(flow: Flow) { DefaultSmsAuthenticationFlow(flow).auth() } 
Intereting Posts
Есть ли Multimap в Котлине? Схема проектирования моста, приводящая к слишком большому количеству генериков В Котлине я могу переопределить некоторые существующие операторы, но как насчет создания новых операторов? Каковы зарезервированные ключевые слова в Котлине? BeanDefinitionParsingException при попытке использовать JPA с загрузкой Kotlin и Spring Как получить доступ к kotlin pojo в java-классе Как я могу сказать Kotlin, что массив или коллекция не могут содержать нули? библиотека kotlin klaxon для json Kotlin JavaScript для файла описания TypeScript IntelliJ Idea при тестировании сразу нескольких модулей включаются только артефакты из одного модуля Android – RoomDb – Объект, вставленный успешно не найден в выбранном запросе в другой активности Как поместить файлы res из проекта в банку в одной папке? Kotlin, Как использовать функцию коллекции, чтобы упростить этот код При инъекции зависимостей Кодина я не хочу распространять экземпляры кодеина повсюду string array literal? Как я просто его кодирую?