Описание тега kotlin-delegate

Шаблон делегирования оказался хорошей альтернативой наследованию реализации, и Kotlin поддерживает его, изначально не требуя шаблонного кода.

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

Делегирование класса

Модель Делегации доказала, чтобы быть хорошей альтернативой наследованию реализации, и Котлин поддерживает его изначально требует нулевого шаблонного кода. КлассDerived может наследовать от интерфейса Base и делегировать все свои общедоступные методы указанному объекту:

interface Base {
    fun print()
}

class BaseImpl(val x: Int) : Base {
    override fun print() { print(x) }
}

class Derived(b: Base) : Base by b

fun main(args: Array<String>) {
    val b = BaseImpl(10)
    Derived(b).print() // prints 10
}

Предложение by в списке супертипов для Derived указывает, что b будут храниться внутри в объектах Derived и компилятор сгенерирует все методы Base что жду b.

Обратите внимание, что переопределения работают так, как и следовало ожидать: компилятор будет использовать ваш overrideреализации вместо тех, что в объекте делегата. Если бы мы добавилиoverride fun print() { print("abc") } к Derived, программа напечатает "abc" вместо "10".

Делегированные свойства

Существуют определенные общие виды свойств, которые, хотя мы можем реализовать их вручную каждый раз, когда они нам нужны, было бы очень хорошо реализовать раз и навсегда и поместить в библиотеку. Примеры включают:

  • ленивые свойства: значение вычисляется только при первом доступе;
  • наблюдаемые свойства: слушатели получают уведомление об изменениях этого свойства;
  • сохранение свойств на карте вместо отдельного поля для каждого свойства.