A delegação controla a alocação de poder / autoridade de uma instância para outra para qualquer objeto. Para implementações de classes e funções, as delegações podem ser usadas em relações estáticas e mutáveis ​​entre elas. A implementação de herança em classes e funções pode ser alterada com a ajuda de técnicas de delegação e as linguagens de programação orientadas a objetos a suportam inatamente, sem qualquer código clichê. A delegação é usada no Kotlin com a ajuda da palavra-chave “por”

Existem dois tipos de delegação presentes no Kotlin: 
Delegação explícita: Suportada por todas as linguagens orientadas a objetos e é feita passando um objeto delegado (aquele a ser implementado) para o objeto delegado (aquele que implementará o objeto delegado). 
Delegação implícita:  Requer suporte em nível de idioma para o padrão de delegação.
 

Vamos discutir o conceito da delegação com a ajuda dos exemplos Exemplo 1:

Como sabemos que em Kotlin, a herança nos fornece um relacionamento estático permanente entre objetos que não são mutáveis ​​enquanto a delegação é, esse fato torna a delegação uma alternativa extremamente poderosa. Neste exemplo, usando a classe Newfeature, podemos implementar a classe base de delegação com novos recursos, delegando todos os seus membros públicos, ou seja, mymessage e messageline, e estamos usando essa implementação com a ajuda da palavra-chave “por”. 
 

// 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()
}

Saída:

GeeksforGeeks
Welcome, GFG!


Exemplo 2: 

Neste exemplo, temos uma classe base de delegação com valor val e método “fun message()”. Na classe Delegationimplementation, estamos atribuindo valor a esta “mensagem divertida” e, posteriormente, de outra classe, estamos usando esta implementação usando a palavra-chave “by” para adicionar uma nova instrução com o mesmo valor val;
 

// 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)
}

Saída:

delegationimplementation y = Hello!GFG
GeeksforGeeks

Vantagens:

1. É um método flexível, poderoso e mutável. 
2. Múltiplas interfaces podem ser implementadas com a ajuda das existentes. 
3. É usado para adicionar novos recursos e valores às implementações atuais.