Sobes.tech
Junior

Kotlin'da interfeyslar qanday amalga oshiriladi?

sobes.tech AI

AIdan javob

Kotlin'da interfeyslar implements kalit so'zi yordamida (Kotlin'da implicit, faqat ikki nuqta bilan ko'rsatiladi) yoki by yordamida delegatsiya qilish orqali amalga oshiriladi.

Asosiy amalga oshirish usullari:

  1. To'g'ridan-to'g'ri amalga oshirish: Ob'ekt yoki sinf to'g'ridan-to'g'ri barcha interfeys a'zolarini amalga oshiradi.
    interface MyInterface {
        fun doSomething()
        val myProperty: String
    }
    
    class MyClass : MyInterface {
        override fun doSomething() {
            println("MyClass ichida biror narsa qilish")
        }
    
        override val myProperty: String = "Salom"
    }
    
    Bir sinfdan meros olish va bir vaqtning o'zida interfeyslarni amalga oshirishda, sinf birinchi bo'lib ko'rsatiladi.
    open class BaseClass
    
    class AnotherClass : BaseClass(), MyInterface {
        override fun doSomething() {
            println("AnotherClass ichida biror narsa qilish")
        }
    
        override val myProperty: String = "Dunyo"
    }
    
  2. Delegatsiya qilish: Interfeysning amalga oshirilishi boshqa ob'ektga delegatsiya qilinadi. by kalit so'zi ishlatiladi. Bu kompozitsiya uchun va ko'p meros olish muammolaridan qochish uchun foydalidir.
    interface DelegatedInterface {
        fun performAction()
    }
    
    class DelegatedObject : DelegatedInterface {
        override fun performAction() {
            println("DelegatedObject tomonidan bajarilgan harakat")
        }
    }
    
    class ImplementingClass(di: DelegatedInterface) : DelegatedInterface by di {
        // ImplementingClass performAction() metodining amalga oshirilishini di ob'ektiga delegatsiya qiladi
    }
    
    Bu holda, ImplementingClass performActionni o'zi amalga oshirmaydi, uning o'rniga performingClass.performAction() chaqiruvi di.performAction() ga yo'naltiriladi.

Bir nechta interfeyslarni, ularning a'zolari nomi bilan amalga oshirishda, nizolarni hal qilish uchun, a'zo va qaysi interfeysdan olinishini aniq belgilash kerak, <Interfeys>.<a'zo> sintaksisi bilan.

interface InterfaceA {
    fun foo() { println("InterfaceA") }
    fun bar()
}

interface InterfaceB {
    fun foo() { println("InterfaceB") }
    fun bar() { println("InterfaceB bar") }
}

class ResolvingConflict : InterfaceA, InterfaceB {
    override fun foo() {
        super<InterfaceA>.foo() // InterfaceA'dan foo ni chaqirish
        super<InterfaceB>.foo() // InterfaceB'dan foo ni chaqirish
    }

    override fun bar() {
        super<InterfaceB>.bar() // InterfaceB'dan bar ni ishlatish
    }
}