Как написать свой по функции расширения - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть функция по умолчанию, подобная этой:

fun <T> makeDefault(): Animal<T> = Animal<Nothing>(
    name = "",
    size = 0,
    age = 0
)

Я видел, что есть оператор by, который можно использовать для таких моделей просмотра:

val model: MyViewModel by viewModels() 

Вопрос: Как я могу создать функцию, которая ведет себя так же, как для моего makeDefault()?

Что я хочу сделать:

val animal: Animal<Dog> by makeDefault()

1 Ответ

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

Вы можете создать свой собственный Делегат , а не расширение :

import kotlin.reflect.KProperty

class DefaultDelegate<T> {
    private var created: Animal<T> = Animal<Nothing>(
            name = "",
            size = 0,
            age = 0
        )

    operator fun getValue(thisRef: Any?, property: KProperty<*>): Animal<T> {
        return created
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Animal<T>) {
        created = value
    }
}

Затем используйте его:

val animal: Animal<Dog> by DefaultDelegate()

Для получения дополнительной информации см. Делегированные свойства делают c

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