Что означает `class C (val field: T): T by field`? - PullRequest
6 голосов
/ 12 апреля 2020

Недавно я встретил следующее объявление класса :

class C(val field: T): T by field

, где T - интерфейс.

Как называется этот метод?

Каков эффект этого объявления?

Ответы [ 2 ]

8 голосов
/ 12 апреля 2020

Это называется делегирование , в частности, это тип делегирования, известный как реализация делегированием.

При этом класс C реализует интерфейс с использованием другого объекта.

то есть, когда вы вызываете метод (функцию), определенный в интерфейсе, тогда вызов будет передан объекту, который вы делегировали в вашем случае, это field

interface T {
    fun print()
}
class TImpl: T {
    override fun print() = print("Hello World!")
}

class C(val field: T) : T by field {...}

fun main() {
    val c = C(TImpl())
    c.print()                 //Prints: Hello World!
}

Здесь вызов print() переводится в TImpl, потому что класс C реализует T с помощью поля.

2 голосов
/ 12 апреля 2020

Этот синтаксис является сокращением, предлагаемым языком kotlin, чтобы сказать, что C реализует T и делегирует все реализации метода T члену field.

В Java или других языках OO вы бы достигли того же, объявив каждый метод T в C и вызвав field.theMethod в каждом из них (он же бесполезный шаблонный код)

Kotlin делает это для вас в результирующем Java байт-коде он производит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...