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:
-
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") } } -
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 } -
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<*>): Txususiyat turiTbo'lgan.thisRefsinf nusxasi,propertyxususiyat 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.