Kotlin в IntelliJ IDEA Kotlin змінні Kotlin типи даних Kotlin операції з числами Kotlin умовні вирази Kotlin умовні конструкції Kotlin цикли Kotlin послідовності Kotlin масиви Kotlin функціональне програмування Kotlin змінна кількість параметрів. Vararg Kotlin повернення результату. оператор return Kotlin однорядкові і локальні функції Kotlin перевантаження функцій Kotlin Лямбда-вирази Kotlin функції вищого порядку Kotlin Анонімні функції Kotlin ООП Класи і об'єкти Kotlin ООП властивості Kotlin ООП конструктор Kotlin ООП функції в класах Kotlin ООП Пакети та імпорт Kotlin ООП модифікатори видимості Kotlin ООП вкладені класи Kotlin ООП інтерфейси Kotlin ООП спадкування Kotlin ООП Перевизначення методів і властивостей Kotlin ООП Абстрактні класи та методи Kotlin ООП Data-класи Kotlin ООП перерахування enums Kotlin ООП Null і nullable-типи Kotlin ООП Обробка винятків Kotlin ООП перетворення типів Kotlin ООП Інфіксна функція Kotlin ООП функції розширення Kotlin ООП Узагальнені класи і функції Kotlin ООП обмеження узагальнень Kotlin ООП Варіантність, коваріантність і контраваріантність Kotlin Колекції. Змінювані і незмінні колекції Kotlin Колекції. LIST список Kotlin Колекції. Set Kotlin Колекції. Map

Kotlin ООП функції розширення


Функції розширення (extension function) дозволяють додати функціонал до вже певним типам. При цьому типи можуть бути визначені десь в іншому місці, наприклад, в стандартній бібліотеці.

Функція розширення визначається наступним чином:

fun тип.имя_функции(параметры) : возвращаемый_тип{
    тело функции
}

За великим рахунком визначення аналогічно визначенню звичайної функції за тим винятком, що після слова fun йде назва типу, для якого визначається функція, і через точку назву функції.

Визначимо пару функцій розширення до стандартних типів Int і String:

fun main(args: Array<String>) {
 
    var hello: String = "hello world"
    println(hello.wordCount('l'))   // 3
    println(hello.wordCount('o'))   // 2
    println(4.square())                 // 16
    println(6.square())                 // 36
}
 
fun String.wordCount(c: Char) : Int{
    var count = 0
    for(n in 0..this.count()-1){
        if(this[n] == c) count++
    }
    return count
}
fun Int.square(): Int{
    return this * this
}

Для типу Int визначена функція зведення в квадрат. У кожній функції розширення через ключове слово this ми можемо посилатися на поточний об'єкт того типу, для якого створюється функція. Наприклад, в функції:

fun Int.square(): Int{
    return this * this
}

Через this звертаємося до того об'єкту, для якого буде визивться функція. І потім ви можемо викликати її наступним чином:

4.square()  // 16

Для типу String визначена функція wordCount, яка підраховує, скільки зустрічається певний символ в рядку.

Слід враховувати, що у функціях розширення ми можемо звертатися до будь-яких загальнодоступним властивостям і методам об'єкта, однак не можемо звертатися до властивостей і методів з модифікаторами private і protected .

Також слід враховувати, що функції розширення не переважають функції, які вже визначені в класі. Якщо функція розширення має ту ж сигнатуру, що і вже наявна функція класу, то компілятор просто ігноруватиме подібну функцію розширення.


Наш партнер:
beta test mp3 playlist downloader