Как инициализировать переменную в 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")
}
Надеюсь, поможет!