Sobes.tech
Middle

Мушкилоти кор кардани делегат дар синф дар Kotlin-ро метавонед шарҳ диҳед?

sobes.tech AI

Ҷавоб аз AI

Делегат дар Kotlin объектист, ки иҷрои вазифаи муайянро ба ӯҳда мегирад ё занҷирҳои усулҳоро ба объекти дигар делегат мекунад.

Сценарияҳои асосии истифода:

  1. Делегатсияи хосиятҳо (Delegated Properties): Таҳвил кардани идоракунии геттерҳо ва сеттерҳои хосият ба объекти дигар.

    • lazy: Ҳисоб кардани арзиши хосият дар аввалин дастрасӣ.
    • observable: Иҷрои амал дар тағйири арзиши хосият.
    • vetoable: Манъ кардани тағйири арзиши хосият бо асоси шароит.
    class Example {
        // Ҳисоб мешавад танҳо дар аввалин дастрасӣ
        val lazyValue: String by lazy {
            println("Ҳисоб мекунам!")
            "Салом"
        }
    
        // Дар ҳар тағйирот даъват мешавад
        var name: String by Delegates.observable("<наме нест>") { prop, old, new ->
            println("Ном аз $old ба $new тағйир ёфт")
        }
    }
    
  2. Делегатсияи интерфейсҳо (Class Delegation): Иҷрои интерфейс тавассути фиристодани даъватҳо ба объекти дигар.

    interface Base {
        fun print()
    }
    
    class BaseImpl(val x: Int) : Base {
        override fun print() {
            println(x)
        }
    }
    
    // Иҷрои Base, делегатсия ба BaseImpl
    class Derived(b: Base) : Base by b
    
    fun main() {
        val b = BaseImpl(10)
        Derived(b).print() // Мебарояд 10-ро чоп кунад
    }
    
  3. Делегатсияи функсияҳо (Function Delegation): Гарчанде ки синтаксиси махсус барои делегатсия кардани функсияҳои алоҳида вуҷуд надорад, ҳамчун барои хосиятҳо ё интерфейсҳо, ин дар асоси композиция ва даъвати методҳои объекти дигар амалӣ мешавад.

Чӣ гуна делегатсия кардани хосиятҳо кор мекунад:

Кодекси Kotlin компилятор кӯмакчи кодро истеҳсол мекунад. Барои хосияти делегатшуда ба объект delegate, компилятор хосияти пинҳонаро истеҳсол мекунад ва методҳои getValue ва setValue (барои хосиятҳои тағйирёбанда) дар объект delegate-ро даъват мекунад, бо интиқоли контексти зарурӣ (экземпляри синф, метадонҳои хосият).

// Мисоли псевдокод, чӣ гуна компилятор кор мекунад: val p: String by delegate
/*
private val _p: Delegate<Any?, String> = delegate_initializer
val p: String
    get() = _p.getValue(this, ::p) // Даъвати getValue дар делегат
*/

Объекти делегат бояд методҳои мувофиқ дошта бошад:

  • getValue(thisRef, property: KProperty<*>): T барои хосияти навъи T. thisRef - намунаи синф, property - метадонҳои хосият.
  • setValue(thisRef, property: KProperty<*>, value: T) барои хосияти тағйирёбанда.

Бенефитҳои истифодаи делегатҳо:

  • Истифодаи такрорӣ коди: Логикаи умумӣ (инициализатсияи суст, пайгирии тағйирот) ба делегат махсус интиқол дода мешавад ва бисёрдафъа истифода мешавад.
  • Беҳтар кардани хонданпазирӣ: Код камтар мегирад, boilerplate-код дар дохили делегат пинҳон мешавад.
  • Модулсозӣ: Логикаи идоракунии хосиятҳо ё иҷрои интерфейсҳо аз логикаи асосии синф ҷудо мешавад.