Sobes.tech
Junior

Kuidas teostatakse liideseid Kotlinis?

sobes.tech AI

Vastus AI-lt

Kotlinis liideseid rakendatakse kasutades märksõna implements (mitte otseselt Kotlinis, lihtsalt näidatakse kahe punktiga) või by edastamiseks.

Peamised rakendamise viisid:

  1. Otsene rakendamine: Objekt või klass rakendab kõiki liidese liikmeid otse.
    interface MyInterface {
        fun doSomething()
        val myProperty: String
    }
    
    class MyClass : MyInterface {
        override fun doSomething() {
            println("Doing something in MyClass")
        }
    
        override val myProperty: String = "Hello"
    }
    
    Pärandades klassist ja rakendades liideseid samaaegselt, näidatakse klass esimesena.
    open class BaseClass
    
    class AnotherClass : BaseClass(), MyInterface {
        override fun doSomething() {
            println("Doing something in AnotherClass")
        }
    
        override val myProperty: String = "World"
    }
    
  2. Rakenduse edastamine: Liidese rakendamine edastatakse teisele objektile. Kasutatakse märksõna by. See on kasulik kompositsiooni ja mitmepärandamise probleemide vältimiseks.
    interface DelegatedInterface {
        fun performAction()
    }
    
    class DelegatedObject : DelegatedInterface {
        override fun performAction() {
            println("Action performed by DelegatedObject")
        }
    }
    
    class ImplementingClass(di: DelegatedInterface) : DelegatedInterface by di {
        // ImplementingClass edastab `performAction()` meetodi rakendamise objekti di
    }
    
    Sel juhul ei rakenda ImplementingClass performAction-i iseseisvalt, vaid performingClass.performAction() väljakutse suunatakse di.performAction()-le.

Kui rakendate mitut liidest koos sama nimega liikmetega, tuleb konflikte lahendada, selgelt üle kirjutades liikme ja näidates, millisest liidesest rakendus võetakse, kasutades süntaksit <Liides>.<liige>.

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() // Kutsub välja `foo` rakenduse InterfaceA-st
        super<InterfaceB>.foo() // Kutsub välja `foo` rakenduse InterfaceB-st
    }

    override fun bar() {
        super<InterfaceB>.bar() // Kasutab `bar` rakenduse InterfaceB-st
    }
}