Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Kotlin, как задать абстрактный массив заданного размера

Споткнулся на пустом месте...
Надо определить абстрактное свойство типа IntArray с заданным количеством элементов
Т.е. как-то так надо
abstract val margins:IntArray[4]
или
abstract val margins:Array[4]
Чтобы в дочерних классах нельзя было переопределить массивом с отличным количеством элементов. Так вообще можно делать или я хочу странного?
UPD
Т.е. чтобы в наследнике было так
override val margins = intArrayOf(10, 20, 30, 40)
А вот на такое ругалось на этапе компиляции
override val margins = intArrayOf(10, 20, 30)
override val margins = intArrayOf(10, 20, 30, 40, 60)


Ответ

Самым адекватным решением (в моем случае) оказалось использование data class с перегруженным оператором get
data class MarginArray(val left: Int, val top: Int, val right: Int, val bottom: Int) { private val _values = arrayOf(left, top, right, bottom) operator fun get(i: Int): Int = _values[i] }
Так как мне, по сути, был нужен только синтаксис доступа как к массиву, то хватило перезагрузки get, но никто не мешает добавить все необходимое перегрузкой операторов и проксированием методов к приватному полю _values, например:
fun toList() = _values.toList() fun iterator() = _values.iterator()

Комментариев нет:

Отправить комментарий