Die Delegation steuert die Zuweisung von Macht/Autorität von einer Instanz zu einer anderen für jedes Objekt. Für Klassen- und Funktionsimplementierungen können Delegierungen sowohl für statische als auch für veränderliche Beziehungen zwischen ihnen verwendet werden. Die Vererbungsimplementierung in Klassen und Funktionen kann mit Hilfe von Delegationstechniken geändert werden, und objektorientierte Programmiersprachen unterstützen sie von Haus aus ohne Boilerplate-Code. Die Delegation wird in Kotlin mit Hilfe des Schlüsselworts  „by“ verwendet.

In Kotlin gibt es zwei Arten der Delegierung: 
Explizite Delegierung: Wird von allen objektorientierten Sprachen unterstützt und erfolgt durch Übergabe eines Delegatobjekts (das zu implementierende) an das delegierende Objekt (dasjenige, das das Delegatobjekt implementiert). 
Implizite Delegierung:  Erfordert Unterstützung auf Sprachebene für das Delegierungsmuster.
 

Lassen Sie uns das Konzept der Delegation anhand der Beispiele diskutieren
Beispiel 1:

Da wir wissen, dass uns die Vererbung in Kotlin eine dauerhafte statische Beziehung zwischen Objekten bietet, die nicht änderbar sind, während die Delegation es ist, macht diese Tatsache die Delegation zu einer äußerst leistungsfähigen Alternative. In diesem Beispiel können wir mit der Newfeature-Klasse die Delegierungsbasisklasse mit neuen Funktionen implementieren, indem wir alle ihre öffentlichen Mitglieder delegieren, dh mymessage und messageline, und wir verwenden diese Implementierung mit Hilfe des Schlüsselworts „by“. 
 

Kotlin

// Kotlin program to illustrate the 
// concept of delegation
  
interface delegation 
{
    fun mymessage()
    fun mymessageline()
}
  
class delegationimplementation(val y: String) : delegation
{
    override fun mymessage() 
    { 
        print(y)
    }
    override fun mymessageline() 
    { 
        println(y)
    }
}
  
class Newfeature(m: delegation) : delegation by m
{
    override fun mymessage() 
    {
        print("GeeksforGeeks")
    }
}
  
// Main function
fun main() 
{
    val b = delegationimplementation("\nWelcome, GFG!")
      
    Newfeature(b).mymessage()
    Newfeature(b).mymessageline()
}

Ausgabe:

GeeksforGeeks
Welcome, GFG!


Beispiel 2: 

In diesem Beispiel haben wir eine Delegations-Basisklasse mit dem Wert val und der Methode „fun message()“. In der Delegationsimplementierungsklasse weisen wir dieser „lustigen Nachricht“ einen Wert zu und später aus einer anderen Klasse verwenden wir diese Implementierung mit dem Schlüsselwort „by“, um eine neue Anweisung mit demselben Wert hinzuzufügen;
 

Kotlin

// Kotlin program to illustrate the 
// concept of delegation
interface delegation
{
    val value: String
    fun mymessage()
}
  
class delegationimplementation(val y: String) : delegation
{
    override val value = "delegationimplementation y = $y"
    override fun mymessage() 
    {
        println(value)
    }
}
  
class Newfeatures(a: delegation) : delegation by a 
{
    override val value = "GeeksforGeeks"
}
  
fun main() 
{
    val b = delegationimplementation("Hello!GFG")
    val derived = Newfeatures(b)
      
    derived.mymessage()
    println(derived.value)
}

Ausgabe:

delegationimplementation y = Hello!GFG
GeeksforGeeks

Vorteile:

1. Es ist eine flexible, leistungsstarke und wandelbare Methode. 
2. Mehrere Schnittstellen können mit Hilfe der vorhandenen implementiert werden. 
3. Es wird verwendet, um neue Funktionen und Werte zu aktuellen Implementierungen hinzuzufügen.