Kotlin dilində sinifdə nümayəndənin işləmə prinsibini izah edə bilərsənmi?
sobes.tech Süni İntellekt
AI-dan cavab
Kotlin-də nümayəndəçi müəyyən bir vəzifəni yerinə yetirən və ya metod çağırışlarını başqa obyektə yönəldən obyektdir.
Əsas istifadə ssenariləri:
-
Xüsusiyyətlərin nümayəndəçiliyi: Xüsusiyyətin getter və setterlərinin idarə olunmasını başqa obyektə ötürmək.
lazy: Xüsusiyyətin dəyərinin ilk girişdə hesablanması.observable: Xüsusiyyətin dəyəri dəyişdikdə bir əməliyyatın yerinə yetirilməsi.vetoable: Şərtə əsasən xüsusiyyətin dəyərinin dəyişməsinin qarşısını almaq.
class Example { // Yalnız ilk girişdə hesablanır val lazyValue: String by lazy { println("Hesablama!") "Salam" } // Hər dəyişiklikdə çağırılır var name: String by Delegates.observable("<ad yoxdur>") { prop, old, new -> println("Ad $old-dən $new-ə dəyişdi") } } -
İnterfeys nümayəndəçiliyi: Bir interfeysi başqa obyektə metod çağırışlarını yönəldərək həyata keçirmək.
interface Base { fun print() } class BaseImpl(val x: Int) : Base { override fun print() { println(x) } } // Base-ni həyata keçirir, BaseImpl-ə çağırışları nümayəndə edir class Derived(b: Base) : Base by b fun main() { val b = BaseImpl(10) Derived(b).print() // 10 çap edir } -
Funksiyaların nümayəndəçiliyi: Xüsusi sintaksis olmasa da, bu konseptual olaraq başqa obyektin metodlarını çağırma və birləşmə yolu ilə həyata keçirilir.
Xüsusiyyətlərin nümayəndəçiliyinin işləmə prinsipi:
Kotlin kompilyatoru köməkçi kod yaradır. delegate obyektinə nümayəndəlik edilən xüsusiyyət üçün, kompilyator gizli bir xüsusiyyət yaradır və getValue və setValue metodlarını (dəyişkən xüsusiyyətlər üçün) delegate obyektində çağırır, lazım olan konteksti (sinif nümunəsi, xüsusiyyət metadataları) ötürür.
// Psevdo-kod nümunəsi, kompilyatorun necə işlədiyini göstərir: val p: String by delegate
/*
private val _p: Delegate<Any?, String> = delegate_initializer
val p: String
get() = _p.getValue(this, ::p) // getValue çağırışı
*/
Nümayəndə obyektin uyğun metodlara malik olması lazımdır:
getValue(thisRef, property: KProperty<*>): Txüsusiyyət tipiTolan.thisRefsinif nümunəsi,propertyxüsusiyyət metadataları.setValue(thisRef, property: KProperty<*>, value: T)dəyişkən xüsusiyyətlər üçün.
Delegatların istifadəsinin üstünlükləri:
- Kodun təkrar istifadəsi: Ümumi məntiq (lazımsız başlanğıc, dəyişikliklərin izlənməsi) ayrıca delegatda çıxarılır və çox istifadə olunur.
- Oxuma asanlığı: Kod daha az yer tutur, boilerplate kod delegatda gizlidir.
- Modullarlıq: Xüsusiyyətlərin idarə olunması və ya interfeyslərin həyata keçirilməsi logikası əsas sinifdən ayrılır.