Kotlin haqida standart delegatlar Kuzatiladigan xususiyatlar Delegatni taqdim etish



Yüklə 34,89 Kb.
səhifə9/10
tarix24.07.2023
ölçüsü34,89 Kb.
#137314
1   2   3   4   5   6   7   8   9   10
Kotlin haqida

class C {
var prop: Type by MyDelegate()
}

// этот код генерируется компилятором:
class C {
private val prop$delegate = MyDelegate()
var prop: Type
get() = prop$delegate.getValue(this, this::prop)
set(value: Type) = prop$delegate.setValue(this, this::prop, value)
}
Kotlin kompilyatori propargumentlar haqida barcha kerakli ma'lumotlarni beradi : birinchi argument thistashqi sinfning namunasi Cva o'zini tavsiflovchi this::propturdagi aks ettirish ob'ektiga KPropertyishora qiladi prop.
To'g'ridan-to'g'ri dastur kodida bog'langan qo'ng'iroq qilinadigan ma'lumotlargathis::prop murojaat qilish uchun sintaksis faqat Kotlin 1.1 versiyasidan beri mavjud.
Delegatni taqdim etish
Eslatma: Kotlin-da delegatni taqdim etish 1.1-versiyadan beri mavjud
Operatorni belgilash orqali provideDelegatesiz mulk topshiriladigan ob'ektni yaratish mantig'ini kengaytira olasiz. O'ng ishlatilayotgan ob'ekt bo'lsa bybelgilaydi provideDelegatea'zosi sifatida yoki sifatida uzaytirish , bu vazifani vakil misol uchun deb ataladi.
Mumkin bo'lgan foydalanish holatlaridan provideDelegatebiri - mulk yaratilganda uning holatini tekshirish.
Masalan, bog'lashdan oldin mulk nomini tekshirishni istasangiz, quyidagicha yozishingiz mumkin:
class ResourceLoader<T>(id: ResourceID) {
operator fun provideDelegate(
thisRef: MyUI,
prop: KProperty<*>
): ReadOnlyProperty {
checkProperty(thisRef, prop.name)
// создание делегата
}

private fun checkProperty(thisRef: MyUI, name: String) { ... }
}

fun bindResource(id: ResourceID): ResourceLoader { ... }

class MyUI {
val image by bindResource(ResourceID.image_id)
val text by bindResource(ResourceID.text_id)
}
provideDelegatebir xil parametrlarga ega getValue:

  • thisRef- bir xil turga ega bo'lishi yoki mulk egasining turidan meros bo'lishi kerak ( kengaytmalar uchun kengaytirilayotgan tur)

  • property- turi KProperty<*>yoki uning asosiy turi bo'lishi kerak . Ushbu funktsiya xususiyat bilan bir xil qiymatni qaytarishi kerak (yoki uning asosiy turi)

Usuli provideDelegateaks davomida har mol-mulk uchun deb ataladi MyUI, va darhol kerakli nazorat qiladi.
Mulk va delegat o'rtasida ushbu in'ektsiya imkoniyatisiz bir xil funktsiyaga erishish uchun siz mulk nomini aniq kiritishingiz kerak bo'ladi, bu juda qulay emas:
// Проверяем имя свойства без "provideDelegate"

Yüklə 34,89 Kb.

Dostları ilə paylaş:
1   2   3   4   5   6   7   8   9   10




Verilənlər bazası müəlliflik hüququ ilə müdafiə olunur ©azkurs.org 2024
rəhbərliyinə müraciət

gir | qeydiyyatdan keç
    Ana səhifə


yükləyin