Можно ли сгруппировать расширения, используя пространство имен в Kotlin? - PullRequest
0 голосов
/ 24 апреля 2020

Добавление слишком большого количества расширений скоро станет грязным, поэтому группировка расширений в пространстве имен каркаса была бы идеальной. Например, вместо добавления всех функций непосредственно в Int, например:

fun Int.operationA() { 
    println("A $this")
}

fun Int.operationB() { 
    println("B $this")
}

// and use it like:
123.operationA()
123.operationB()

Я бы предпочел использовать его внутри пространства имен платформы, например:

123.framework.operationA()
123.framework.operationB()

// Declaring it like this would be nice
fun Int.framework.operationA() { 
    println("A $this")
}

В Swift это возможно выполнить sh это с использованием протоколов и расширений с реализациями по умолчанию. Как насчет Kotlin? Есть ли способ сделать это?

1 Ответ

1 голос
/ 24 апреля 2020
class IntFramework(val x: Int) {
    fun operationA() ...
    fun operationB() ...
}

// or
class IntFramework(val x: Int)
fun IntFramework.operationA() ...
fun IntFramework.operationB() ...

val Int.framework get() = IntFramework(this)

и если вы хотите добавить больше методов, объявите их как расширения на IntFramework. Но это не идиоматизм c и, скорее всего, удивит других разработчиков, работающих с вашим кодом или зависящих от него (может быть, не тех, кто работает в Swift?).

Если вам нужна только поддержка Kotlin 1.3+, Вы можете сделать его inline class, который должен устранить любые издержки по сравнению с определением метода расширения для Int напрямую.

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