Sobes.tech
Middle

Xüsusiyyət nümayəndələrinin xüsusiyyəti nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də mülkiyyət delegatları, mülkiyyətin alınması və təyin olunması məntiqini köməkçi sinfə — delegat — köçürməyə imkan verir.

Xüsusiyyətlər:

  1. getValuesetValue-nin Anlaşılması: Oxumağa əlverişli (val) mülkiyyətlər üçün delegat getValue metoduna malik olmalıdır. Oxuma və yazma üçün əlverişli (var) mülkiyyətlər üçün isə, delegat həm getValue, həm də setValue metodlarına sahib olmalıdır. Bu metodlar aşağıdakı parametrləri qəbul edir:

    • Mülkiyyəti ehtiva edən obyektə istinad (sinif üzvləri üçün).
    • KProperty obyektində mülkiyyətin meta məlumatları.
  2. Standart delegatlar: Kotlin bir sıra standart delegatlarla təchiz olunmuşdur:

    • lazy: Mülkiyyətin təxirə salınmış başlanğıcı üçün.
    • observable: Mülkiyyət dəyəri dəyişdikdə müəyyən bir əməliyyat yerinə yetirmək üçün.
    • vetoable: Mülkiyyət dəyəri dəyişdikdə əməliyyat yerinə yetirmək və dəyişiklikləri ləğv etmək imkanı ilə.
    • Xəritələr üçün delegatlar: Mülkiyyət Map-də saxlanıla bilər.
  3. İstənilən delegatlar: Öz sinflərinizi yarada bilərsiniz. Sinif ReadOnlyProperty ( val üçün) və ya ReadWriteProperty ( var üçün) interfeysini həyata keçirməlidir.

lazy-dən istifadə nümunəsi:

// Sahə ilk girişdə yalnızca başlanır
val lazyValue: String by lazy { 
    println("Dəyəri hesablayıram")
    "Hello"
}

observable-dən istifadə nümunəsi:

import kotlin.properties.Delegates

var name: String by Delegates.observable("<ad yoxdur>") {
    property, oldValue, newValue ->
    println("$oldValue -> $newValue")
}

Xüsusi delegat nümunəsi:

import kotlin.reflect.KProperty

class Delegate {
    operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
        return "$thisRef, mülkiyyət '${property.name}' dəyəri"
    }

    operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
        println("$thisRef, '${property.name}' mülkiyyətinin dəyəri '$value' olaraq dəyişdirildi")
    }
}

class Example {
    var p: String by Delegate()
}