Kotlin поддерживает шаблон «делегирование» , вводя новое ключевое слово «by» . Используя это ключевое слово или методологию делегирования, Kotlin позволяет производному классу получать доступ ко всем реализованным общедоступным методам интерфейса через определенный объект. Следующий пример демонстрирует, как это происходит в Kotlin.
В примере у нас есть один интерфейс «Base» с его абстрактным методом с именем «printme()». В классе BaseImpl мы реализуем эту «printme()», а позже из другого класса мы используем эту реализацию, используя ключевое слово «by».
Делегирование свойств
В предыдущем разделе мы узнали о шаблоне проектирования делегирования, используя ключевое слово «by». В этом разделе мы узнаем о делегировании свойств с использованием некоторых стандартных методов, упомянутых в библиотеке Kotlin.
Делегирование означает передачу ответственности другому классу или методу. Когда свойство уже объявлено в некоторых местах, мы должны повторно использовать один и тот же код для их инициализации. В следующих примерах мы будем использовать некоторую стандартную методологию делегирования, предоставляемую Kotlin, и некоторые стандартные библиотечные функции при реализации делегирования в наших примерах.
Lazy()
Lazy — это лямбда-функция, которая принимает свойство в качестве входных данных и взамен возвращает экземпляр Lazy<T> , где <T> — это тип используемых свойств. Давайте посмотрим на следующий пример, чтобы понять, как это работает.
В приведенном выше фрагменте кода мы передаем переменную «myVar» в функцию Lazy, которая, в свою очередь, присваивает значение своему объекту и возвращает его основной функции.
Observable()
Observable() принимает два аргумента для инициализации объекта и возвращает их вызываемой функции. В следующем примере мы увидим, как использовать метод Observable() для реализации делегирования.
Выражение после ключевого слова «by» это делегирование. Методы get() и set() переменной p будут делегированы ее методам getValue() и setValue() , определенным в классе Delegate.
Для приведенного выше фрагмента кода ниже приведен класс делегата, который нам нужно сгенерировать, чтобы присвоить значение переменной p.
При чтении будет вызываться метод getValue(), а при установке переменной будет вызываться метод setValue().