Sobes.tech
Middle

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:

  1. 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")
        }
    }
    
  2. İ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
    }
    
  3. 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ə getValuesetValue 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<*>): T xüsusiyyət tipi T olan. thisRef sinif nümunəsi, property xü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.