Можно ли создать «класс расширения» в Kotlin? - PullRequest
1 голос
/ 07 августа 2020

В настоящее время я работаю над проектом Kotlin, имеющим дело с большим количеством оборудования, и я искал способ создать что-то похожее на функцию расширения, за исключением класса. В этом случае я хочу, чтобы один класс действовал как подкласс другого, но все же был отделен и в другом пакете. Обычно я бы использовал такой класс:

class Foo() {
    fun doSomething() {
        ...
    }
}
class Bar(val foo: Foo) {
    fun doSomethingWithFoo() {
        foo.doSomething()
    }
}
val myFoo = Foo()
val myBar = Bar(myFoo)
myBar.doSomethingWithFoo()

Можно ли сделать этот код более читабельным, сделав что-нибудь, что можно сделать с функцией расширения?

// Is this possible?
val myFoo = Foo()
val myBar = myFoo.Bar()
myBar.doSomethingWithFoo()

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

// Wrapper function I'm using
fun Foo.Bar(): Bar {
    return Bar(this)
}

1 Ответ

3 голосов
/ 07 августа 2020

Похоже, что вы описываете делегат : класс, который перенаправляет все свои методы (если они не переопределены) экземпляру другого класса.

Kotlin имеет встроенная поддержка для этого (в отличие от Java), но для того, чтобы это работало, оба класса должны реализовать интерфейс:

interface MyInterface {
    fun doSomething()
}

class Foo() : MyInterface {
    override fun doSomething() {
        // ...
    }
}

class Bar(val foo: MyInterface) : MyInterface by foo

Это почти то же самое, что и код в вопросе, но без шаблона для ручного указания пересылки doSomething().

Хитростью является невинно выглядящий by foo: он указывает, что Bar является делегатом, реализующим все методы MyInterface с помощью переадресовав их на foo. (Конечно, вы можете добавлять и переопределять методы по мере необходимости - было бы мало смысла в делегате, который ведет себя точно как объект, которому он пересылается!)

Подробнее см. Kotlin документация .

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