Sobes.tech
Junior

Kotlin-də interfeyslərin həyata keçirilməsi necədir?

sobes.tech Süni İntellekt

AI-dan cavab

Kotlin-də interfeyslər implements açar sözü ilə (Kotlin-də qismən, sadəcə iki nöqtə ilə göstərilir) və ya by ilə vəkilçilik istifadə edilərək həyata keçirilir.

Əsas həyata keçirmə üsulları:

  1. Birbaşa həyata keçirmə: Obəkt və ya sinif birbaşa bütün interfeys üzvlərini həyata keçirir.
    interface MyInterface {
        fun doSomething()
        val myProperty: String
    }
    
    class MyClass : MyInterface {
        override fun doSomething() {
            println("MyClass-də bir şey edir")
        }
    
        override val myProperty: String = "Salam"
    }
    
    Bir sinifdən irs alma və eyni zamanda interfeysləri həyata keçirmə zamanı, sinif əvvəl göstərilir.
    open class BaseClass
    
    class AnotherClass : BaseClass(), MyInterface {
        override fun doSomething() {
            println("AnotherClass-də bir şey edir")
        }
    
        override val myProperty: String = "Dünya"
    }
    
  2. Həvalə edilən həyata keçirmə: Interfeysin həyata keçirilməsi başqa bir obyektə həvalə edilir. by açar sözü istifadə olunur. Bu, kompozisiya və çox irs alma problemlərindən qaçmaq üçün faydalıdır.
    interface DelegatedInterface {
        fun performAction()
    }
    
    class DelegatedObject : DelegatedInterface {
        override fun performAction() {
            println("Hərəkət DelegatedObject tərəfindən yerinə yetirilir")
        }
    }
    
    class ImplementingClass(di: DelegatedInterface) : DelegatedInterface by di {
        // ImplementingClass, performAction() metodunun həyata keçirilməsini di obyektinə həvalə edir
    }
    
    Bu halda, ImplementingClass performAction-ı öz-özünə həyata keçirmir, əvəzində performingClass.performAction() çağırışı di.performAction()-a yönəldilir.

Bir neçə interfeysə eyni adlı üzvlərlə həyata keçirmə zamanı, münaqişələri həll etmək üçün üzvü açıq şəkildə yenidən təyin etmək və hansı interfeysə aid olduğunu göstərmək lazımdır, <Interfeys>.<üzv> sintaksisi istifadə edilərək.

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-nun həyata keçirilməsini çağırır
        super<InterfaceB>.foo() // InterfaceB-dan foo-nun həyata keçirilməsini çağırır
    }

    override fun bar() {
        super<InterfaceB>.bar() // InterfaceB-dən bar-ın həyata keçirilməsini istifadə edir
    }
}