Делегировать один интерфейс нескольким реализациям

#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» приводит к нахождению решений, аналогичных тем, которые у нас уже есть, как показано в последнем блоке кода. Это говорит мне, что нет более краткого способа, верно?