Kotlin
Interfaces
Buscar..
Observaciones
Consulte también: Documentación de referencia de Kotlin para interfaces: Interfaces
Interfaz básica
Una interfaz de Kotlin contiene declaraciones de métodos abstractos e implementaciones de métodos predeterminados, aunque no pueden almacenar el estado.
interface MyInterface {
fun bar()
}
Esta interfaz ahora puede ser implementada por una clase de la siguiente manera:
class Child : MyInterface {
override fun bar() {
print("bar() was called")
}
}
Interfaz con implementaciones por defecto.
Una interfaz en Kotlin puede tener implementaciones predeterminadas para funciones:
interface MyInterface {
fun withImplementation() {
print("withImplementation() was called")
}
}
Las clases que implementen dichas interfaces podrán usar esas funciones sin volver a implementarlas.
class MyClass: MyInterface {
// No need to reimplement here
}
val instance = MyClass()
instance.withImplementation()
Propiedades
Las implementaciones predeterminadas también funcionan para los que obtienen y establecen propiedades:
interface MyInterface2 {
val helloWorld
get() = "Hello World!"
}
Las implementaciones de accesores de interfaz no pueden usar campos de respaldo
interface MyInterface3 {
// this property won't compile!
var helloWorld: Int
get() = field
set(value) { field = value }
}
Implementaciones multiples
Cuando varias interfaces implementan la misma función, o todas ellas se definen con una o más implementaciones, la clase derivada debe resolver manualmente la llamada apropiada
interface A {
fun notImplemented()
fun implementedOnlyInA() { print("only A") }
fun implementedInBoth() { print("both, A") }
fun implementedInOne() { print("implemented in A") }
}
interface B {
fun implementedInBoth() { print("both, B") }
fun implementedInOne() // only defined
}
class MyClass: A, B {
override fun notImplemented() { print("Normal implementation") }
// implementedOnlyInA() can by normally used in instances
// class needs to define how to use interface functions
override fun implementedInBoth() {
super<B>.implementedInBoth()
super<A>.implementedInBoth()
}
// even if there's only one implementation, there multiple definitions
override fun implementedInOne() {
super<A>.implementedInOne()
print("implementedInOne class implementation")
}
}
Propiedades en interfaces
Puedes declarar propiedades en interfaces. Dado que una interfaz no puede tener un estado, solo puede declarar una propiedad como abstracta o proporcionando una implementación predeterminada para los usuarios.
interface MyInterface {
val property: Int // abstract
val propertyWithImplementation: String
get() = "foo"
fun foo() {
print(property)
}
}
class Child : MyInterface {
override val property: Int = 29
}
Conflictos al implementar múltiples interfaces con implementaciones predeterminadas
Cuando se implementa más de una interfaz que tiene métodos del mismo nombre que incluyen implementaciones predeterminadas, es ambiguo para el compilador qué implementación se debe usar. En el caso de un conflicto, el desarrollador debe anular el método conflictivo y proporcionar una implementación personalizada. Esa implementación puede optar por delegar a las implementaciones por defecto o no.
interface FirstTrait {
fun foo() { print("first") }
fun bar()
}
interface SecondTrait {
fun foo() { print("second") }
fun bar() { print("bar") }
}
class ClassWithConflict : FirstTrait, SecondTrait {
override fun foo() {
super<FirstTrait>.foo() // delegate to the default implementation of FirstTrait
super<SecondTrait>.foo() // delegate to the default implementation of SecondTrait
}
// function bar() only has a default implementation in one interface and therefore is ok.
}
súper palabra clave
interface MyInterface {
fun funcOne() {
//optional body
print("Function with default implementation")
}
}
Si el método en la interfaz tiene su propia implementación predeterminada, podemos usar la palabra clave super para acceder a él.
super.funcOne()