Sobes.tech
Junior

Kotlin программалоо тилиндеги кеңейтүүлөр эмне?

sobes.tech AI

AIден жооп

Котлондо кеңейтүүлөр жаңы функцияларды же касиеттерди түзмө-түз класстарга кошууга мүмкүндүк берет, мурас алуу же декоратор колдонбоо менен.

Негизги концепциялар:

  • Кеңейтүү функциялары (Extension Functions): Класстарга жаңы методдорду кошот.

    // Кеңейтүү функциясын аныктоо
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Кеңейтүү функциясын колдонуу
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString "HelloWorld" болот
    

    this сөзү кеңейтүү функциясынын ичинде объектке шилтеме кылат (жогоруда myStringке).

  • Кеңейтүү касиеттери (Extension Properties): Жаңы касиеттерди класстарга кошууга мүмкүндүк берет, бирок күйү болбойт, яғни маалымат сактабайт:

    // Кеңейтүү касиетин аныктоо
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Колдонуу
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // indexLast 2 болот
    

    Кеңейтүү касиеттеринин геттери болушу керек, сеттери милдеттүү эмес.

Өзгөчөлүктөр:

  • Статикалык диспетчеризация: Кеңейтүүнүн чакыруусу өзгөрмөнүн түрүнө карап аныкталат, аткаруу учурунда эмес. Бул виртуалдык методдордон айырмаланат.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // "Parent" чыгат, себеби `p`нин түрү Parent
    
  • Жеке жана корголгон мүчөлөр: Кеңейтүүлөр класс мүчөлөрүнө жеке же корголгон мүчөлөргө кайрыла албайт.

  • Класс-компаньон объекттер үчүн кеңейтүүлөр: Объекттерди кеңейтүүгө болот:

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Көпчүлүк")
    
    MyClass.printName() // "MyClass Көпчүлүк" чыгат
    
  • Көрүнүү чөйрөсү (Visibility): Кеңейтүүлөр файлда жарыялануусу керек жана башка файлдарда колдонуу үчүн импорттолушу керек.

Кеңейтүүлөр күчтүү инструмент болуп саналат, алардын жардамы менен сырттан келген китепканалардын класстарына функционалдуулук кошуп, алардын түпкү кодун өзгөртпөстөн, окула турган жана ийкемдүү код түзүүгө мүмкүндүк берет.