Учебники

Котлин — Делегация

Kotlin поддерживает шаблон проектирования «делегирование» , вводя новое ключевое слово «by» . Используя это ключевое слово или методологию делегирования, Kotlin позволяет производному классу получать доступ ко всем реализованным публичным методам интерфейса через определенный объект. Следующий пример демонстрирует, как это происходит в Kotlin.

Live Demo

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> — это тип используемых им свойств. Давайте посмотрим на следующее, чтобы понять, как это работает.

Live Demo

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 () для реализации делегирования.

Live Demo

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 ().