Junior
¿Cómo se implementan las interfaces en Kotlin?
sobes.tech AI
Respuesta de la IA
Las interfaces en Kotlin se implementan usando la palabra clave implements (implícito en Kotlin, simplemente se indica con dos puntos) o by para delegar.
Formas principales de implementación:
- Implementación directa: El objeto o clase implementa todos los miembros de la interfaz directamente.
Cuando se hereda de una clase y se implementan interfaces simultáneamente, la clase se indica primero.interface MyInterface { fun doSomething() val myProperty: String } class MyClass : MyInterface { override fun doSomething() { println("Haciendo algo en MyClass") } override val myProperty: String = "Hola" }open class BaseClass class AnotherClass : BaseClass(), MyInterface { override fun doSomething() { println("Haciendo algo en AnotherClass") } override val myProperty: String = "Mundo" } - Delegación de implementación: La implementación de la interfaz se delega a otro objeto. Se usa la palabra clave
by. Esto es útil para composición y para evitar problemas con la herencia múltiple de implementación.En este caso,interface DelegatedInterface { fun performAction() } class DelegatedObject : DelegatedInterface { override fun performAction() { println("Acción realizada por DelegatedObject") } } class ImplementingClass(di: DelegatedInterface) : DelegatedInterface by di { // ImplementingClass delega la implementación del método performAction() al objeto di }ImplementingClassno implementaperformActionpor sí misma, en su lugar, la llamada aperformingClass.performAction()se redirige adi.performAction().
Al implementar varias interfaces con miembros con el mismo nombre, es necesario resolver conflictos, sobrescribiendo explícitamente el miembro y especificando de qué interfaz se toma la implementación, usando la sintaxis <Interfaz>.<miembro>.
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() // Llamada a la implementación de foo de InterfaceA
super<InterfaceB>.foo() // Llamada a la implementación de foo de InterfaceB
}
override fun bar() {
super<InterfaceB>.bar() // Usando la implementación de bar de InterfaceB
}
}