9. Основы Kotlin. Классы и интерфейсы

Реализация toString

Функция toString() используется для формирования строкового представления любого значения типа Any?. Она неявно используется в строковых шаблонах вроде "$someVal" — при подстановке значения в строку оно заменяется своим строковым представлением. Она же неявно используется в отладчике при отображении значений ключевых переменных. Она же используется при провале тестов для отображения несовпадающих значений — ожидаемого и реального.

Таким образом, хотя toString() не очень часто используется напрямую, она очень полезна для вспомогательных целей. По этой причине, программистам на Котлине (и на Java тоже) рекомендуется переопределять эту функцию так, чтобы по строковому представлению можно было понять реальное содержимое объекта. Скажем, список традиционно представляется в виде строки как [elem1, elem2, elem3]. Из тех же соображений, матрицу можно было бы представить как [[elem11, elem12], [elem21, elem22], [elem31, elem32]], где elemIJ — элемент из I-го ряда и J-й колонки.

Функция toString() не имеет параметров, а её результат имеет тип String. Шаблон для матрицы может выглядеть так:

class MatrixImpl<E> : Matrix<E> {
    override val height: Int = TODO()
    override val width: Int = TODO()

    // ... Other functions ...

    override fun toString(): String {
        val sb = StringBuilder()
        sb.append("[")
        for (row in 0..height - 1) {
            sb.append("[")
            for (column in 0..width - 1) {
                sb.append(this[row, column])
                // Подумайте здесь про запятые и пробелы, или попробуйте использовать joinToString
            }
            sb.append("]")
        }
        sb.append("]")
        return "$sb" // or, sb.toString()
    }
}

Здесь StringBuilder — специальный тип, используемый для построения внутри себя строки. Его использование здесь эффективнее, чем определение var str: String и построение строки в нём, поскольку такой метод потребует многократного создания новых строк. Внутри себя StringBuilder содержит постепенно расширяющуюся строку, изначально пустую. Функция sb.append дописывает к этой строке новую, а "$sb" в конце достаёт из построителя накопленную строку.

Упражнения

Откройте файл srс/lesson9/task1/Matrix.kt в проекте KotlinAsFirst.

Он содержит определение интерфейса Matrix<E>, функции-создателя createMatrix и реализации MatrixImpl<E>. Выберите один из рассмотренных выше вариантов реализаций матрицы (или придумайте свой) и напишите определения ВСЕХ функций в классе MatrixImpl, после чего напишите определение функции-создателя. Протестируйте свою реализацию, используя тесты из test/lesson9/task1/Tests.kt.

Откройте теперь файл srс/lesson9/task2/Matrices.kt. Файл содержит задачи на различные операции с матрицами, все они используют готовый интерфейс Matrix<E>. С использованием данного интерфейса и функции-создателя, решите одну или несколько задач из этого файла. Протестируйте свою реализацию, используя тесты из test/lesson9/task2/Tests.kt. Многие задачи из этого файла сложны, особенно это касается двух последних задач про «Игру в 15″ — вторую из них, пожалуй, следует считать самой сложной задачей в этом курсе.

Поздравляем, вы решили и все дополнительные задачи нашего курса по Котлину. В качестве свободного чтения вы можете прочитать раздел 10 (он не содержит задач).

Добавить комментарий