Я видел несколько подобных вопросов, но никто не объяснил, почему делегирование ограничено интерфейсами?
В большинстве случаев на практике у нас есть что-то, что фактически не имеет никакого интерфейса, это класс, который ничего не реализует, кроме как предоставляет некоторую функциональность или реализует абстрактный класс.
Существует ли какое-либо фундаментальное ограничение, которое ограничивает это интерфейсом, или мы можем ожидать, что у kotlin будет неограниченная делегирование в будущем?
Это особенно полезно, если мы хотим расширить функциональность класса с использованием композиции, а не наследования.
class A {} class B(val a: A) : A by a {}
Когда вы делегируете интерфейс, класс все еще реализует интерфейс. Поэтому для согласованности, если вы можете делегировать класс, он должен работать одинаково. Т.е.
class A(x: Int) { fun foo() = x } class B(val a: A) : A by a {}
необходимо скомпилировать
class B(val a: A) : A { override fun foo() = a.foo() }
кроме этого не работает:
foo
не является open
и не может быть переопределен.
вам нужно вызвать конструктор A
class B(val a: A) : A(ax)
тоже не поможет: x
не является членом A
Как насчет equals
и hashCode
: они делегированы? Любое решение приведет к странным последствиям.