Мне было интересно, как делегированные свойства ( "by -Keyword" ) работают под капотом.
Я получаю, что по контракту делегат (правая сторона "by" ) должен реализовать метод get и setValue (...), но как это может обеспечить компилятор и как эти методы могут быть доступны во время выполнения?
Моя первоначальная мысль заключалась в том, что, очевидно, делегаты должны мне внедрить какой-то "SuperDelegate" -Interface, но, похоже, это не так.
Таким образом, единственный вариант, который я знаю, - это использовать Reflection для доступа к этим методам, возможно, реализованным на низком уровне внутри самого языка. Я считаю это несколько странным, поскольку, по моему мнению, это будет довольно неэффективно. Также API Reflection не является даже частью stdlib, что делает его еще более странным.
Я предполагаю, что последний уже является (частью) ответа. Поэтому позвольте мне также задать вам следующее: почему нет интерфейса SuperDelegate, который объявляет методы getter и setter, которые мы вынуждены использовать в любом случае? Разве это не было бы намного чище?
В вопросе
не имеет значения следующее:Описанный интерфейс уже определен в ReadOnlyProperty и ReadWriteProperty. Чтобы решить, какой из них использовать, можно было бы сделать зависимым от того, есть ли у нас val/var. Или даже опустите это, поскольку вызов метода setValue в val предотвращается компилятором и использует только интерфейс ReadWriteProperty как SuperDelegate.
Возможно, когда требуется, чтобы делегат реализовал определенный интерфейс, конструкция была бы менее гибкой. Хотя это предполагает, что класс, используемый в качестве делегата, возможно, не осознает того, что он используется как таковой, что я считаю маловероятным с учетом конкретных требований к необходимым методам. И если вы все еще настаиваете, вот сумасшедшая мысль: почему бы даже не зайти так далеко, чтобы этот класс реализовал требуемый интерфейс через Extension ( Я знаю, что это невозможно сейчас, но, черт возьми, почему бы и нет? Вероятно, там хороший "почему бы нет", пожалуйста, дайте мне знать как примечание).