Шаг 173.
Основы Kotlin.
Наследование. Класс Any

    На этом шаге мы рассмотрим особенности реализации вывода в этом классе.

    При выводе значения переменной в консоль, вызывается функция с именем toString(), чтобы определить, как значение выглядит в консоли. Для некоторых типов это просто: например, значение строки выражается через значение String. Но для других типов это не так очевидно.

    Класс Any включает абстрактные определения функций вроде toString(), которые поддерживаются целевой платформой, где выполняется проект.

    Заглянув в исходный код класса Any, можно увидеть следующее:

/**
* Корень иерархии классов в Kotlin.
* Все классы в Kotlin наследуют суперкласс [Any].
*/
public open class Any {
public open operator fun equals(other: Any?): Boolean
public open fun hashCode(): Int
public open fun toString(): String
}
//

    Обратите внимание, что функция toString() отсутствует в объявлении класса. Но где она тогда находится и что возвращает, когда вызывается, например, для экземпляра Player?

    Вспомните последнюю строку в printIsSourceOfBlesings(), которая выводит результат в консоль:

fun printIsSourceOfBlessings(any: Any) {
    val isSourceOfBlessings = if (any is Player) {
        any.isBlessed
    } else {
        (any as Room).name == "Fount of Blessings"
    }
    println("$any is a source of blessings: $isSourceOfBlessings")
}

    Результат вызова printIsSourceOfBlesings(), в случае передачи ей благословленного игрока, выглядит примерно так:

Player@71efa55d is a source of blessings: true

    Player@71efa55d - это результат реализации toString() по умолчанию в классе Any. Kotlin использует реализацию java.lang.Object.toString() из JVM, потому что для компиляции вы выбрали JVM. Вы можете переопределить toString() в вашем классе Player, чтобы возвращать что-то более удобочитаемое.

    Тип Any - это один из способов для Kotlin оставаться платформонезависимым. Он служит абстракцией, представляющей типичный суперкласс для каждой конкретной платформы, такой как JVM. То есть когда целевой платформой является JVM, для toString() в Any выбирается реализация java.lang.Object.toString(), но при компиляции в JavaScript ее реализация будет отличаться. Это отвлеченное объяснение означает, что вам не надо знать особенности каждой системы, в которой вы будете запускать свой код. Вместо этого можно просто положиться на тип Any.

    Со следующего шага мы начнем рассматривать объекты.




Предыдущий шаг Содержание Следующий шаг