Существует ли красивая конструкция для делегирования реализации интерфейса? Допустим, у нас есть интерфес:public interface I { int a(); int b(); } И есть его реализация:public class IR implements I { @Override public int a() { return 1; } @Override public int b() { return 2; } } Хочется построить класс, который будет так же реализовывать I и для этого делегировать все запросы по I к инстансу IR. Можно сделать через композицию:public class A implements I { IR delegat = new IR(); @Override public int a() { return delegat.a(); } @Override public int b() { return delegat.b(); } } Не красиво. Можно, конечно, через наследование:public class B extends IR { } Но это вносит свои ограничения, например, я не могу менять делегата в процессе жизни. Поэтому хочется через композицию. Понятно, что Java тут ничем помочь не сможет. А нет ли в других языках конструкций наподобие:class B implements I { IR delegat = new IR(); implements I by delegate; }
Да, в некоторых других языках программирования такая конструкция называется "делегирование интерфейса". Например, в языке Kotlin есть специальное ключевое слово "by", которое позволяет делегировать реализацию интерфейса другому объекту.
Пример реализации интерфейса I с помощью делегирования в Kotlin выглядел бы примерно так:
interface I { fun a(): Int fun b(): Int } class IR : I { override fun a(): Int { return 1 } override fun b(): Int { return 2 } } class B : I by IR()
Таким образом, класс B будет автоматически делегировать все вызовы методов интерфейса I объекту IR. В результате такой конструкции код становится более читаемым и поддерживаемым.
Да, в некоторых других языках программирования такая конструкция называется "делегирование интерфейса". Например, в языке Kotlin есть специальное ключевое слово "by", которое позволяет делегировать реализацию интерфейса другому объекту.
Пример реализации интерфейса I с помощью делегирования в Kotlin выглядел бы примерно так:
interface I {fun a(): Int
fun b(): Int
}
class IR : I {
override fun a(): Int {
return 1
}
override fun b(): Int {
return 2
}
}
class B : I by IR()
Таким образом, класс B будет автоматически делегировать все вызовы методов интерфейса I объекту IR. В результате такой конструкции код становится более читаемым и поддерживаемым.