Sobes.tech
Junior

Kotlin dasturlash tilida kengaytmalar nima?

sobes.tech AI

AIdan javob

Kotlin'dagi kengaytmalar mavjud sinflarga yangi funksiyalar yoki xususiyatlar qo'shish imkonini beradi; meros olish yoki dekoratorlardan foydalanmasdan.

Asosiy tushunchalar:

  • Kengaytma funksiyalar: Sinflarga yangi metodlar qo'shadi.

    // Kengaytma funksiyasining ta'rifi
    fun String.removeWhitespaces(): String {
        return this.filter { it.isWhitespace().not() }
    }
    
    // Kengaytma funksiyasidan foydalanish
    val myString = " Hello World "
    val cleanedString = myString.removeWhitespaces() // cleanedString "HelloWorld" bo'ladi
    

    Kengaytma funksiyasidagi this kalit so'zi, kengaytma chaqirilayotgan ob'ektga ishora qiladi (yuqoridagi misolda myString).

  • Kengaytma xususiyatlari: Yangi xususiyatlar qo'shish imkonini beradi, lekin holatga ega bo'lmaydi, ya'ni ma'lumot saqlay olmaydi. Har kirishda hisoblanadi.

    // Kengaytma xususiyatining ta'rifi
    val <T> List<T>.lastIndex: Int
        get() = size - 1
    
    // Foydalanish
    val myList = listOf(1, 2, 3)
    val indexLast = myList.lastIndex // 2
    

    Kengaytma xususiyatlari getterga ega bo'lishi kerak. Setter ixtiyoriy.

Xususiyatlar:

  • Statik taqsimot: Kengaytma chaqiruvi, ob'ektning ish vaqtidagi turi emas, o'zgaruvchining turiga qarab aniqlanadi. Bu, ob'ektga yo'naltirilgan dasturlashdagi virtual metodlardan farq qiladi.

    open class Parent
    class Child : Parent()
    
    fun Parent.printType() = println("Parent")
    fun Child.printType() = println("Child")
    
    val p: Parent = Child()
    p.printType() // "Parent" chiqaradi, chunki 'p' o'zgaruvchisining turi Parent
    
  • Maxfiy va protected a'zolar: Kengaytmalar, kengaytirilayotgan sinfning maxfiy yoki protected a'zolariga kirish imkoniga ega emas.

  • Kompaniya ob'ekt kengaytmalari: Sinfning kompaniya ob'ektlarini kengaytirish mumkin.

    class MyClass {
        companion object {
            fun create() = MyClass()
        }
    }
    
    fun MyClass.Companion.printName() = println("MyClass Companion")
    
    MyClass.printName() // "MyClass Companion" chiqaradi
    
  • Ko'rinish (Visibility): Kengaytmalar faylda e'lon qilinishi va boshqa fayllarda foydalanish uchun import qilinishi kerak.

Kengaytmalar, o'qilishi oson va moslashuvchan kod yaratish uchun kuchli vositadir; tashqi kutubxonalar sinflariga funksionallik qo'shish imkonini beradi, ularning manba kodini o'zgartirmasdan.