На этом шаге мы рассмотрим особенности исполнения этой операции.
Функцию castFireball(), которую вы объявили, со своим аргументом по умолчанию для параметра numFireballs, можно вызвать двумя способами:
castFireball()
castFireball(numFireballs)
Если функция имеет несколько реализаций, как, например, castFireball(), то ее называют перегруженной.
Перегруженность не всегда является последствием аргумента по умолчанию. Можно реализовать несколько функций с одним и тем же именем. Чтобы увидеть, как это работает, откройте Kotlin REPL (Tools | Kotlin | Kotlin REPL) и введите следующий код.
fun performCombat() { println("You see nothing to fight!") } fun performCombat(enemyName: String) { println("You begin fighting $enemyName.") } fun performCombat(enemyName: String, isBlessed: Boolean) { if ((isBlessed)) { println("You begin fighting $enemyName. You are blessed with 2X damage!") } else { println("You begin fighting $enemyName.") } }
Рис.1. Объявление перегруженной функции (REPL)
Вы объявили три реализации функции performCombat (Начать битву). Все они являются функциями Unit без возвращаемого значения. Первая не принимает аргументов. Вторая принимает только один аргумент - имя противника. Последняя принимает два аргумента: имя противника и булеву переменную, с признаком благословения игрока. Каждая функция генерирует отдельное сообщение (или сообщения) через вызов println().
Когда вы вызываете performCombat(), как оболочка REPL понимает, какая именно вам нужна? Она проверит переданные аргументы и найдет ту функцию, которая соответствует им. Вызовите в REPL реализацию каждой функции performCombat(), как показано ниже.
performCombat() performCombat("Ulrich") performCombat("Hildr", true)
Вызов и вывод будет таким:
Рис.2. Вызов и вывод перегруженной функции (REPL)
Обратите внимание, что выбор той или иной реализации осуществляется на основе количества аргументов.
На следующем шаге мы рассмотрим имена функций в обратных кавычках.