Kotlin поддерживает шаблон проектирования «делегирование» , вводя новое ключевое слово «by» . Используя это ключевое слово или методологию делегирования, Kotlin позволяет производному классу получать доступ ко всем реализованным публичным методам интерфейса через определенный объект. Следующий пример демонстрирует, как это происходит в Kotlin.
interface Base { fun printMe() //abstract method } class BaseImpl(val x: Int) : Base { override fun printMe() { println(x) } //implementation of the method } class Derived(b: Base) : Base by b // delegating the public method on the object b fun main(args: Array<String>) { val b = BaseImpl(10) Derived(b).printMe() // prints 10 :: accessing the printMe() method }
В этом примере у нас есть один интерфейс «Base» с абстрактным методом «printme ()». В классе BaseImpl мы реализуем этот «printme ()», а позже из другого класса мы используем эту реализацию, используя ключевое слово «by».
Приведенный выше фрагмент кода выдаст следующий вывод в браузере.
10
Делегирование недвижимости
В предыдущем разделе мы узнали о шаблоне проектирования делегирования, используя ключевое слово «by». В этом разделе мы узнаем о делегировании свойств с использованием некоторых стандартных методов, упомянутых в библиотеке Kotlin.
Делегирование означает передачу ответственности другому классу или методу. Когда свойство уже объявлено в некоторых местах, мы должны повторно использовать тот же код для их инициализации. В следующих примерах мы будем использовать некоторую стандартную методологию делегирования, предоставленную Kotlin, и некоторую стандартную библиотечную функцию при реализации делегирования в наших примерах.
Использование Lazy ()
Lazy — это лямбда-функция, которая принимает свойство в качестве входа и, в свою очередь, дает экземпляр Lazy <T> , где <T> — это тип используемых им свойств. Давайте посмотрим на следующее, чтобы понять, как это работает.
val myVar: String by lazy { "Hello" } fun main(args: Array<String>) { println(myVar +" My dear friend") }
В приведенном выше фрагменте кода мы передаем переменную «myVar» в функцию Lazy, которая в свою очередь присваивает значение своему объекту и возвращает его основной функции. Ниже приведен вывод в браузере.
Hello My dear friend
Delegetion.Observable ()
Observable () принимает два аргумента для инициализации объекта и возвращает то же самое вызываемой функции. В следующем примере мы увидим, как использовать метод Observable () для реализации делегирования.
import kotlin.properties.Delegates class User { var name: String by Delegates.observable("Welcome to Tutorialspoint.com") { prop, old, new -> println("$old -> $new") } } fun main(args: Array<String>) { val user = User() user.name = "first" user.name = "second" }
Приведенный выше фрагмент кода выдаст следующий вывод в браузере.
first -> second
Обычно синтаксис — это выражение после делегирования ключевого слова «by». Методы get () и set () переменной p будут делегированы ее методам getValue () и setValue (), определенным в классе Delegate.
class Example { var p: String by Delegate() }
Для приведенного выше фрагмента кода ниже приведен класс делегата, который нам нужно сгенерировать, чтобы присвоить значение переменной p .
class Delegate { operator fun getValue(thisRef: Any?, property: KProperty<*>): String { return "$thisRef, thank you for delegating '${property.name}' to me!" } operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) { println("$value has been assigned to '${property.name} in $thisRef.'") } }
Во время чтения будет вызван метод getValue () и при установке переменной будет вызван метод setValue ().