#kotlin #delegates
#kotlin #делегаты
Вопрос:
Может ли класс делегировать интерфейс нескольким реализациям с помощью нескольких строк? Учитывая этот интерфейс:
interface Foo {
fun doA()
fun doB()
}
Следующий класс будет компилироваться для одного делегата:
class FooImpl(delegate: Foo): Foo by delegate
Хотя он бесполезен, он генерирует байт-код Java для того, что он должен делать: делегировать Foo
-> Foo
.
Возможно ли это и для списка делегатов? Таким образом, что он делегирует Foo
-> List<Foo>
. Нравится:
class FooImpl(delegates: List<Foo>): Foo by delegates
Прямо сейчас наша кодовая база заполнена такими классами, как:
class FooImpl(private val delegates: List<Foo>): Foo {
override fun doA() { delegates.forEach { it.doA() }
override fun doB() { delegates.forEach { it.doB() }
}
Это похоже на напряженную работу, и она излишне подвержена ошибкам, плюс это создает ненужную работу для разработчика, пишущего код, и разработчика, просматривающего код. Я знаю, что это может стать сложным для возвращаемых значений, но этого никогда не будет. В текущем коде всегда есть набор интерфейса, 2 фактические реализации и корневая реализация, заполненная doA() { delegates.forEach { it.doA() }
.
Можно ли упростить это с помощью Kotlin?
Комментарии:
1. Что бы это сделало для методов, возвращающих значение?
2. я вижу сложный узор
3. @gidds Что касается проблемы в целом, я мог бы придумать несколько решений, таких как первое из списка или самое быстрое для возврата. Для этой конкретной проблемы: ни одна функция не вернет значение.
4. @sidgate Поиск «составного шаблона kotlin» приводит к нахождению решений, аналогичных тем, которые у нас уже есть, как показано в последнем блоке кода. Это говорит мне, что нет более краткого способа, верно?