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:
- Otsene rakendamine: Objekt või klass rakendab kõiki liidese liikmeid otse.
Pärandades klassist ja rakendades liideseid samaaegselt, näidatakse klass esimesena.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" } - Rakenduse edastamine: Liidese rakendamine edastatakse teisele objektile. Kasutatakse märksõna
by. See on kasulik kompositsiooni ja mitmepärandamise probleemide vältimiseks.Sel juhul ei rakendainterface 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 }ImplementingClassperformAction-i iseseisvalt, vaidperformingClass.performAction()väljakutse suunataksedi.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
}
}