На этом шаге мы рассмотрим назначение и правила использования такой функции.
Ваше первое расширение позволяет добавить любую степень восторга в 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, чтобы добавить новые возможности через наследование. Как ранее упоминалось, расширения - хороший вариант, если вы хотите добавить функциональности в класс, которым не можете управлять или который нельзя использовать для создания подкласса.
На следующем шаге мы рассмотрим объявление расширения для суперкласса.