Шаг 209.
Основы Kotlin.
Расширения. Объявление функции-расширения

    На этом шаге мы рассмотрим назначение и правила использования такой функции.

    Ваше первое расширение позволяет добавить любую степень восторга в String. Объявите его в Extensions.kt.

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount)


Рис.1. Добавление расширения для типа String (Extensions.kt)

    Функции-расширения объявляются тем же способом, что и другие функции, но с одним отличием: определяя функцию расширения, вы также указываете тип, известный как принимающий тип, которому расширение добавляет возможностей. Для функции addEnthusiasm() указан принимающий тип String.

    Тело функции addEnthusiasm() - это всего лишь одно выражение, которое возвращает строку: содержимое this и 1 или более восклицательных знаков, в зависимости от значения аргумента amount (1 - это значение по умолчанию). Ключевое слово this ссылается на экземпляр объекта-приемника, для которого вызвано расширение (в этом случае экземпляр String).

    Теперь можно вызвать функцию addEnthusiasm() для любого экземпляра String. Испытайте новую функцию-расширение, объявив строку в функции main() и вызвав для нее функцию-расширение addEnthusiasm() с выводом результата.

fun String.addEnthusiasm(amount: Int = 1) = this + "!".repeat(amount)

fun main(args: Array<String>) {
    println("Madrigal has left the building".addEnthusiasm())
}


Рис.2. Вызов нового расширения для экземпляра объекта-приемника String (Extensions.kt)

    Запустите Extensions.kt и посмотрите, добавляет ли функция-расширение восклицательный знак в строку, как и задумывалось.

    Можно ли создать подкласс String, чтобы добавить эту возможность экземплярам String? В IntelliJ посмотрите на исходный код объявления String, нажав клавишу Shift дважды для открытия диалогового окна Search Everywhere, и введите в поле для поиска "String.kt".


Рис.3. Окно для поиска

    Вы увидите такое объявление класса:


Рис.4. Объявление класса

    Так как ключевое слово open отсутствует в объявлении класса String, вы не сможете создать подкласс String, чтобы добавить новые возможности через наследование. Как ранее упоминалось, расширения - хороший вариант, если вы хотите добавить функциональности в класс, которым не можете управлять или который нельзя использовать для создания подкласса.

    На следующем шаге мы рассмотрим объявление расширения для суперкласса.




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