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() // InterfaceAдан foo реализациясын чакырабыз
        super<InterfaceB>.foo() // InterfaceBдан foo реализациясын чакырабыз
    }

    override fun bar() {
        super<InterfaceB>.bar() // InterfaceBдан bar реализациясын колдонуп жатабыз
    }
}