Sobes.tech
Junior

Kako se implementiraju interfejsi u Kotlinu?

sobes.tech АИ

Одговор од АИ

Интерфејси у 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
    }
}