Sobes.tech
Junior

Чӣ гуна татбиқи интерфейсҳо дар Kotlin анҷом дода мешавад?

sobes.tech AI

Ҷавоб аз AI

Интерфейсҳо дар Kotlin бо истифода аз калимаи калидии implements (ки дар Kotlin ғайрирасмӣ аст, танҳо тавассути ду нуқта нишон дода мешавад) ё by барои делегатсия иҷро мешаванд.

Роҳҳои асосии иҷроиш:

  1. Иҷрои мустақим: Объект ё синф ҳама аъзои интерфейсро мустақиман иҷро мекунад.
    interface MyInterface {
        fun doSomething()
        val myProperty: String
    }
    
    class MyClass : MyInterface {
        override fun doSomething() {
            println("Doing something in MyClass")
        }
    
        override val myProperty: String = "Hello"
    }
    
    Ҳангоми меросгирӣ аз синф ва иҷрои интерфейсҳо ҳамзамон, синф аввал нишон дода мешавад.
    open class BaseClass
    
    class AnotherClass : BaseClass(), MyInterface {
        override fun doSomething() {
            println("Doing something in AnotherClass")
        }
    
        override val myProperty: String = "World"
    }
    
  2. Делегатсияи иҷроиш: Иҷрои интерфейс ба объекти дигар делегатсия мешавад. Калимаи калидии by истифода мешавад. Ин барои композиция ва пешгирӣ аз мушкилоти меросгирии бисёрҷонибаи иҷроиш кӯмак мекунад.
    interface DelegatedInterface {
        fun performAction()
    }
    
    class DelegatedObject : DelegatedInterface {
        override fun performAction() {
            println("Action performed by DelegatedObject")
        }
    }
    
    class ImplementingClass(di: DelegatedInterface) : DelegatedInterface by di {
        // ImplementingClass иҷрои метод performAction()-ро ба объект di делегатсия мекунад
    }
    
    Дар ин ҳолат ImplementingClass performAction-ро мустақиман иҷро намекунад, балки даъвати performingClass.performAction() ба di.performAction() равона мешавад.

Ҳангоми иҷрои чандин интерфейс бо аъзои номеӣ, лозим аст, ки муноқишаҳоро ҳал кунед, бо рӯшан навиштани аъзои ва нишон додани он, ки аз кадом интерфейс иҷроиш гирифта мешавад, бо истифода аз синтаксис <Интерфейс>.<член>.

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() // Иҷрои foo аз InterfaceA-ро даъват мекунад
        super<InterfaceB>.foo() // Иҷрои foo аз InterfaceB-ро даъват мекунад
    }

    override fun bar() {
        super<InterfaceB>.bar() // Иҷрои bar аз InterfaceB-ро истифода мебарад
    }
}