Kotlin - Delegación
Soportes Kotlin “delegation” patrón de diseño mediante la introducción de una nueva palabra clave “by”. Usando esta palabra clave o metodología de delegación, Kotlin permite que la clase derivada acceda a todos los métodos públicos implementados de una interfaz a través de un objeto específico. El siguiente ejemplo demuestra cómo sucede esto en Kotlin.
interface Base {
fun printMe() //abstract method
}
class BaseImpl(val x: Int) : Base {
override fun printMe() { println(x) } //implementation of the method
}
class Derived(b: Base) : Base by b // delegating the public method on the object b
fun main(args: Array<String>) {
val b = BaseImpl(10)
Derived(b).printMe() // prints 10 :: accessing the printMe() method
}
En el ejemplo, tenemos una interfaz "Base" con su método abstracto llamado "printme ()". En la clase BaseImpl, estamos implementando este "printme ()" y luego desde otra clase estamos usando esta implementación usando la palabra clave "by".
El fragmento de código anterior producirá el siguiente resultado en el navegador.
10
Delegación de propiedad
En la sección anterior, aprendimos sobre el patrón de diseño de delegación usando la palabra clave "por". En esta sección, aprenderemos sobre la delegación de propiedades usando algunos métodos estándar mencionados en la biblioteca de Kotlin.
La delegación significa pasar la responsabilidad a otra clase o método. Cuando una propiedad ya está declarada en algunos lugares, entonces debemos reutilizar el mismo código para inicializarla. En los siguientes ejemplos, usaremos alguna metodología de delegación estándar proporcionada por Kotlin y alguna función de biblioteca estándar al implementar la delegación en nuestros ejemplos.
Usando Lazy ()
Lazy es una función lambda que toma una propiedad como entrada y, a cambio, da una instancia de Lazy<T>, donde <T> es básicamente el tipo de propiedades que está usando. Echemos un vistazo a lo siguiente para entender cómo funciona.
val myVar: String by lazy {
"Hello"
}
fun main(args: Array<String>) {
println(myVar +" My dear friend")
}
En el fragmento de código anterior, estamos pasando una variable "myVar" a la función Lazy, que a cambio asigna el valor a su objeto y devuelve el mismo a la función principal. A continuación se muestra la salida en el navegador.
Hello My dear friend
Delegetion.Observable ()
Observable () toma dos argumentos para inicializar el objeto y devuelve el mismo a la función llamada. En el siguiente ejemplo, veremos cómo usar el método Observable () para implementar la delegación.
import kotlin.properties.Delegates
class User {
var name: String by Delegates.observable("Welcome to Tutorialspoint.com") {
prop, old, new ->
println("$old -> $new")
}
}
fun main(args: Array<String>) {
val user = User()
user.name = "first"
user.name = "second"
}
El fragmento de código anterior producirá el siguiente resultado en el navegador.
first -> second
En general, la sintaxis es la expresión después de que se delega la palabra clave "by". losget() y set() métodos de la variable p será delegado a su getValue() y setValue() métodos definidos en la clase Delegate.
class Example {
var p: String by Delegate()
}
Para el fragmento de código anterior, a continuación se muestra la clase de delegado que necesitamos generar para asignar el valor en la variable p.
class Delegate {
operator fun getValue(thisRef: Any?, property: KProperty<*>): String {
return "$thisRef, thank you for delegating '${property.name}' to me!"
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: String) {
println("$value has been assigned to '${property.name} in $thisRef.'")
}
}
Mientras lee, se llamará al método getValue () y mientras se configura la variable se llamará al método setValue ().