Как инициализировать переменную в Kotlin с интерфейсным типом?

Я новичок в Kotlin. Я хотел попробовать приложение create-реагировать-kotlin-, так как в настоящее время я являюсь разработчиком реакции и хочу изучить Kotlin.

Я испытываю трудности с созданием переменных. Я пытаюсь сделать это:

fun main(args: Array<String>) {
    val rootDiv = document.getElementById("root")
    val gm : GameUiProps
    gm.numPlayers = 2
    gm.cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
    gm.playerArray = arrayOf("Player 1", "Player 2")

    RBuilder.render(rootDiv) {
        GameUi(gm)
    }
}

мой gm переменная не инициализируется, и я не могу понять, как это сделать.

Мне нужно инициализировать мой компонент GameUi с помощью реквизита, но я не могу понять, как это сделать.

Так GameUiProps происходит от моего компонента

interface GameUiProps : RProps {
    var numPlayers: Int
    var playerArray: Array<String>
    var cardArray: Array<String>
}

class GameUi(props: GameUiProps) : RComponent<GameUiProps, RState>(props) {

    private fun RBuilder.createHands() {
        var numPlayers = props.numPlayers
        val handArray: ArrayList<Unit> = ArrayList()
        while (numPlayers > 0) {
            handArray.add(
                    handUi(
                            props.playerArray[numPlayers],
                            props.cardArray[numPlayers]
                    )
            )
            numPlayers--
        }
    }

    override fun RBuilder.render() {
        div {
            h1("sweet") {
                +"RKT"
            }
            div {
                createHands()
            }
        }
    }
}

2 ответа

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

Что у тебя есть (val gm: GameUiProps) является просто объявлением поля, не присваивая ему ничего. Вы, очевидно, не можете получить к нему доступ или написать какие-либо свойства.

Вам нужно либо создать простую реализацию с помощью конструктора, либо анонимный объект.

Класс, который объявляет все поля интерфейса в конструкторе:

class GameUiPropsImpl(
    override var numPlayers: Int, 
    override var playerArray: Array<String>, 
    override var cardArray: Array<String>) : GameUiProps

тогда в вашем fun main:

val gm = GameUiPropsImpl(2, arrayOf("Player 1", "Player 2"), arrayOf("Card to be dealt", "Cards to be Dealt"))

Или используя анонимный класс, реализующий интерфейс:

val gm = object: GameUiProps{
    override var numPlayers = 2
    override var playerArray = arrayOf("Player 1", "Player 2")
    override var cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
}

Прошло некоторое время, но для тех, кому это может понадобиться, вам просто нужно присвоить переменнуюgmк объекту типаGameUiProps. Ниже то, что я бы сделал.

      val gm = object : GameUiProps{
   override var numPlayers = 2
   override var cardArray = arrayOf("Card to be dealt", "Cards to be Dealt")
   override var playerArray = arrayOf("Player 1", "Player 2")
}

Надеюсь, поможет!

Другие вопросы по тегам