Sobes.tech
Middle

Kotlin tilida sinfda delegatning ishlash prinsipi qanday?

sobes.tech AI

AIdan javob

Kotlin'da delegat, ma'lum bir vazifani bajaradigan yoki metod chaqiriqlarini boshqa obyekta delegatsiya qiladigan obyektdir.

Asosiy foydalanish holatlari:

  1. Xususiyatlar delegatsiyasi: Xususiyatning getter va setterlarini boshqa obyekta o'tkazish.

    • lazy: Xususiyat qiymatini birinchi kirishda hisoblash.
    • observable: Xususiyat qiymati o'zgarganda harakatni bajarish.
    • vetoable: Shart asosida xususiyat qiymatini o'zgartirishni taqiqlash.
    class Example {
        // Faqat birinchi kirishda hisoblanadi
        val lazyValue: String by lazy {
            println("Hisoblayapman!")
            "Salom"
        }
    
        // Har o'zgarishda chaqiriladi
        var name: String by Delegates.observable("<ism yo'q>") { prop, old, new ->
            println("Ism $old dan $new ga o'zgardi")
        }
    }
    
  2. Interfeys delegatsiyasi: Interfeysni boshqa ob'ekt metodlarini yo'naltirish orqali amalga oshirish.

    interface Base {
        fun print()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun print() {
            println(x)
        }
    }
    
    // Base ni amalga oshiradi, BaseImpl ga chaqiriqlarni delegatsiya qiladi
    class Derived(b: Base) : Base by b
    
    fun main() {
        val b = BaseImpl(10)
        Derived(b).print() // 10 ni chiqaradi
    }
    
  3. Funktsiyalar delegatsiyasi: Aniq sintaksis mavjud emas, lekin bu konsept sifatida kompozitsiya va boshqa ob'ekt metodlarini chaqirish orqali amalga oshiriladi.

Xususiyatlar delegatsiyasining ishlash prinsipi:

Kotlin kompilyatori yordamchi kod ishlab chiqaradi. delegate ob'ektiga delegatsiya qilingan xususiyat uchun, kompilyator yashirin xususiyat yaratadi va getValue va setValue metodlarini (o'zgaruvchan xususiyatlar uchun) delegate ob'ekti ustida chaqiradi, kerakli kontekstni (sinf nusxasi, xususiyat metadatalari) o'tkazadi.

// Psevdo-kod misoli, kompilyator qanday ishlashini ko'rsatadi: val p: String by delegate
/*
private val _p: Delegate<Any?, String> = delegate_initializer
val p: String
    get() = _p.getValue(this, ::p) // getValue chaqiruvi
*/

Delegat ob'ekti mos metodlarga ega bo'lishi kerak:

  • getValue(thisRef, property: KProperty<*>): T xususiyat turi T bo'lgan. thisRef sinf nusxasi, property xususiyat metadatalari.
  • setValue(thisRef, property: KProperty<*>, value: T) o'zgaruvchan xususiyatlar uchun.

Delegatlar foydalanishining afzalliklari:

  • Kodning qayta ishlatilishi: Umumiy mantiq (kechiktirilgan boshlash, o'zgarishlarni kuzatish) alohida delegatda chiqariladi va takroran ishlatiladi.
  • O'qish osonligi: Kod kamroq yoziladi, boilerplate kod delegatda yashiriladi.
  • Modullilik: Xususiyatlarni boshqarish yoki interfeyslarni amalga oshirish logikasi asosiy sinf logikasidan ajratiladi.