// этот код генерируется компилятором: class C {
privateval 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)
// создание делегата }
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"