Шаг 169.
Основы Kotlin.
Наследование. Проверка типов

    На этом шаге мы рассмотрим особенности использования оператора is.

    Нельзя сказать, что NyetHack - невероятно сложная программа. Но законченная ее версия может включать множество классов и подклассов. Можно очень старательно выбирать имена для своих переменных, но все равно иногда будет возникать неуверенность в том, какой тип получает та или иная переменная во время выполнения программы. Избавиться от сомнений в типе объекта вам поможет оператор is.

    Опробуйте его в Kotlin REPL. Создайте экземпляр Room (вам понадобится импортировать Room в REPL).

import Room

var room = Room("Foyer")


Рис.1. Создание экземпляра Room (REPL)

    Узнайте, является ли room экземпляром класса Room, использовав оператор is.

room is Room

true


Рис.2. Проверка room is Room ( REPL)

    Тип объекта слева от оператора is сравнивается с типом, указанным справа. Выражение возвращает true, если типы совпадают, и false, если нет.

    Теперь проверьте, является ли room экземпляром класса TownSquare.

room is TownSquare

false


Рис.3. Проверка room is TownSquare (REPL)

    Переменная room имеет тип Room, который является предком для TownSquare. Но объект room не является экземпляром TownSquare.

    Попробуйте еще одну переменную, на этот раз с типом TownSquare.

var townSquare = TownSquare() 
townSquare is TownSquare

true


Рис.4. Проверка townSquare is TownSquare (REPL)

townSquare is Room

true


Рис.5. Проверка townSquare is Room (REPL)

    Переменная townSquare имеет тип TownSquare, а также тип Room. Напомним, что именно эта идея делает полиморфизм возможным.

    Если вам нужно узнать тип переменной, то проверка типа - самое простое решение. Используя проверку типов и условные операторы, можно организовать ветвление логики. Но не забывайте о том, как полиморфизм может повлиять на эту логику.

    Например, создайте выражение when в Kotlin REPL, которое возвращает Room или TownSquare в зависимости от типа переменной.

var townSquare = TownSquare() 
var className = when(townSquare) { 
  is TownSquare -> "TownSquare" 
  is Room -> "Room"
  else -> throw IllegalArgumentException()
}
print(className)


Рис.6. Проверка типа в ветвлении с условием (REPL)

    Первое условие в выражении when определяется как истинное, потому что townSquare - это тип TownSquare. Второе условие тоже истинное, потому что townSquare также относится к типу Room. Но для вас это уже неважно, так как первое условие уже удовлетворено и второе проверяться просто не будет.

    Запустите этот код, и в консоли появится строка TownSquare (рисунок 6).

    А теперь поменяем ветви местами.

var townSquare = TownSquare() 
var className = when(townSquare) { 
  is Room -> "Room"
  is TownSquare -> "TownSquare" 
  else -> throw IllegalArgumentException()
}
print(className)


Рис.7. Проверка типов с перевернутыми условиями (REPL)

    Запустите код. Теперь в консоли появится строка Room (рисунок 7), поскольку первое условие определено как истинное.

    Если ветвление зависит от типа объекта, порядок выполнения имеет значение.

    На следующем шаге мы рассмотрим иерархию типов в языке Kotlin.




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