Как это назвать из другого класса? - PullRequest
0 голосов
/ 14 февраля 2020

У меня есть следующий код:

object CommonUtil {
    fun Int.dp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
    fun Int.px(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()
}

Хотя я могу сделать эту функцию внутри этого объекта:

fun test() {
    10.dp()
}

Можно ли сделать что-то вроде CommonUtil.10.dp() также из другого класса

Ответы [ 3 ]

2 голосов
/ 14 февраля 2020

Предполагая, что вы хотите расширить функциональность Ints (скажем, в TargetModule.kt), продвиньте функции расширения как функции верхнего уровня в определяющем модуле и импортируйте их в модуль using. Например,

// CommonUtil.kt -- defining module
package commonutil
fun Int.dp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
fun Int.px(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

// TargetModule.kt -- using module
import commonutil.dp
import commonutil.px
... 10.dp()
2 голосов
/ 14 февраля 2020

Вы можете делать то, что вы хотите, как это:

with(CommonUtil) {
    10.dp()
}

Хотя вы должны рассмотреть другие способы разработки вашей функции:

  • Передача Int в качестве параметра, а не как получатель:
    CommonUtil.dp(10)
    
  • Объявление Int.dp() как функции верхнего уровня, если вам не нужны данные из CommonUtil (как в вашем случае), или если вы можете объявить эти данные как public или internal:
    10.dp()
    

Если ваш объект CommonUtil не хранит никаких данных и содержит только полезные функции, гораздо лучше избавиться от этого объекта и просто сделать все его функции верхнего уровня.

Например, ваш CommonUtil.kt файл может выглядеть так:

fun Int.dp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
fun Int.px(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

Таким образом, вы можете написать 10.dp() в любом месте вашего кода.

0 голосов
/ 14 февраля 2020

Функции расширения должны быть определены как функции уровня пакета. Итак, просто удалите объект CommonUtil и поместите функцию расширения непосредственно в файл Kotlin.

fun Int.dp(): Int = (this / Resources.getSystem().displayMetrics.density).toInt()
fun Int.px(): Int = (this * Resources.getSystem().displayMetrics.density).toInt()

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

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