Как реализовать метод getComponent (/ * Class * /) для видеоигр в kotlin - PullRequest
0 голосов
/ 12 декабря 2018

Я пишу на kotlin, разрабатываю текстовую RPG-игру для Android.Я в настоящее время нахожусь в разработке моей объектной системы, идущей с проектированием компонента стратегии / сущности.Я застрял в функции getComponent и понятия не имею, что я делаю

Мне нужен метод, который принимает ссылку на тип Class, а затем сравнивает его со всеми типами классов экземпляра компонента.

Я пытался использовать дженерики, KClass, Java Type, но не могу найти ответ.

Моя главная проблема - оператор «как».Я понятия не имею, что он принимает.

Все, что я до сих пор получил, это:

fun getComponent(clazz : KClass<*>) : Component? {
    for(component in components) {
        if(component is clazz) {
            return component
        }
    }
    return null
}

Этот код неправильный.IntelliJ предупреждает меня, что clazz не существует, поскольку он не является настоящим классом.

1 Ответ

0 голосов
/ 12 декабря 2018

У вас есть экземпляр KClass, который представляет собой объект времени выполнения, представляющий тип, используемый для отражения.У вас есть два основных варианта здесь.Вы можете использовать reified generics , вот так, что позволяет вам полностью избежать отражения:

inline fun <reified T : Component> getComponent() : T? {
    for(component in components) {
        if(component is T) {
            return component
        }
    }
    return null
}

Этот метод может быть вызван так:

getComponent<SomeClass>()

В качестве альтернативы вы можете использовать KClass.isInstance :

fun getComponent(clazz : KClass<*>) : Component? {
    for(component in components) {
        if(clazz.isInstance(component)) {
            return component
        }
    }
    return null
}

Вы можете сделать это немного более удобным с помощью дженериков и приведения:

fun <T : Component> getComponent(clazz : KClass<*>) : T? {
    for(component in components) {
        if(clazz.isInstance(component)) {
            return component as T
        }
    }
    return null
}

Дляоба они используются одинаково:

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