Kotlin - Delegazione

Kotlin supporta “delegation” design pattern introducendo una nuova parola chiave “by”. Utilizzando questa parola chiave o metodologia di delega, Kotlin consente alla classe derivata di accedere a tutti i metodi pubblici implementati di un'interfaccia tramite un oggetto specifico. L'esempio seguente mostra come ciò avvenga in 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 
}

Nell'esempio, abbiamo un'interfaccia "Base" con il suo metodo astratto chiamato "printme ()". Nella classe BaseImpl, stiamo implementando questo "printme ()" e successivamente da un'altra classe stiamo utilizzando questa implementazione utilizzando la parola chiave "by".

La parte di codice precedente produrrà il seguente output nel browser.

10

Delegazione della proprietà

Nella sezione precedente, abbiamo imparato a conoscere il modello di progettazione della delega utilizzando la parola chiave "by". In questa sezione, impareremo la delega delle proprietà utilizzando alcuni metodi standard menzionati nella libreria Kotlin.

Delegare significa trasferire la responsabilità a un'altra classe o metodo. Quando una proprietà è già dichiarata in alcuni punti, dovremmo riutilizzare lo stesso codice per inizializzarli. Nei seguenti esempi, utilizzeremo una metodologia di delega standard fornita da Kotlin e alcune funzioni di libreria standard durante l'implementazione della delega nei nostri esempi.

Usare Lazy ()

Lazy è una funzione lambda che accetta una proprietà come input e in cambio fornisce un'istanza di Lazy<T>, dove <T> è fondamentalmente il tipo di proprietà che sta utilizzando. Diamo uno sguardo a quanto segue per capire come funziona.

val myVar: String by lazy {
   "Hello"
}
fun main(args: Array<String>) {
   println(myVar +" My dear friend")
}

Nella parte di codice sopra, stiamo passando una variabile "myVar" alla funzione Lazy, che in cambio assegna il valore al suo oggetto e restituisce lo stesso alla funzione principale. Di seguito è riportato l'output nel browser.

Hello My dear friend

Delegetion.Observable ()

Observable () accetta due argomenti per inizializzare l'oggetto e restituisce lo stesso alla funzione chiamata. Nell'esempio seguente vedremo come utilizzare il metodo Observable () per implementare la delega.

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"
}

La parte di codice precedente produrrà il seguente output nel browser.

first -> second

In generale, la sintassi è l'espressione dopo la delega della parola chiave "by". Ilget() e set() metodi della variabile p sarà delegato al suo getValue() e setValue() metodi definiti nella classe Delegate.

class Example {
   var p: String by Delegate()
}

Per la parte di codice sopra, di seguito è riportata la classe delegato che dobbiamo generare per assegnare il valore nella variabile 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.'")
   }
}

Durante la lettura, verrà chiamato il metodo getValue () e durante l'impostazione della variabile verrà chiamato il metodo setValue ().