0Pricing
Kotlin Academy · Aula

A Palavra-chave by

Delegue a implementação da interface

A Palavra-chave by é uma aula grátis de Kotlin Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Kotlin Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Kotlin Academy inclui 4 aulas no total.

O que é delegação?

A delegação de classes permite que um objeto transfira a implementação de uma interface para outro objeto. A linguagem Kotlin oferece esse recurso por meio da palavra-chave by.

É composição sem esforço.

Uma interface para delegar

Comece com uma interface e uma implementação concreta. Mais adiante, delegaremos para essa implementação.

interface Speaker {
    fun speak(): String
}

class LoudSpeaker : Speaker {
    override fun speak() = "HELLO!"
}

fun main() {
    println(LoudSpeaker().speak())
}

A palavra-chave de delegação

Escreva class X(d: Iface) : Iface by d. O compilador gera métodos de encaminhamento que chamam d para cada membro da interface.

interface Speaker {
    fun speak(): String
}

class LoudSpeaker : Speaker {
    override fun speak() = "HELLO!"
}

class Announcer(s: Speaker) : Speaker by s

fun main() {
    val a = Announcer(LoudSpeaker())
    println(a.speak())
}

Sem código repetitivo

Sem by, você teria de escrever manualmente um método de encaminhamento para cada função da interface. A delegação gera todos eles automaticamente.

interface Repository {
    fun save(item: String): String
    fun count(): Int
}

class MemoryRepo : Repository {
    private val items = mutableListOf<String>()
    override fun save(item: String): String { items.add(item); return item }
    override fun count() = items.size
}

class LoggingRepo(r: Repository) : Repository by r

fun main() {
    val repo = LoggingRepo(MemoryRepo())
    repo.save("a")
    println(repo.count())
}

Substituindo membros selecionados

Você pode substituir apenas os membros que deseja personalizar; os demais continuam sendo encaminhados ao delegado.

interface Repository {
    fun save(item: String): String
    fun count(): Int
}

class MemoryRepo : Repository {
    private val items = mutableListOf<String>()
    override fun save(item: String): String { items.add(item); return item }
    override fun count() = items.size
}

class LoggingRepo(private val r: Repository) : Repository by r {
    override fun save(item: String): String {
        println("saving " + item)
        return r.save(item)
    }
}

fun main() {
    val repo = LoggingRepo(MemoryRepo())
    repo.save("book")
    println(repo.count())
}

O delegado como parâmetro

O delegado geralmente é passado pelo construtor primário. Você pode manter uma referência com private val se também substituir alguns membros.

interface Clock { fun now(): Int }

class FixedClock : Clock { override fun now() = 12 }

class App(private val clock: Clock) : Clock by clock

fun main() {
    println(App(FixedClock()).now())
}

Delegando interfaces padrão

Você pode delegar para interfaces de coleções integradas, obtendo imediatamente um invólucro que se comporta como a coleção subjacente.

class TaggedList(private val inner: List<String>) : List<String> by inner {
    val tag = "v1"
}

fun main() {
    val tl = TaggedList(listOf("x", "y"))
    println(tl.size)
    println(tl[0])
    println(tl.tag)
}

Como isso é compilado

Nos bastidores, o compilador armazena o delegado e emite implementações de encaminhamento. Os métodos gerados simplesmente chamam o método correspondente do delegado. É o mesmo que escrever o encaminhamento manualmente, sem a digitação repetitiva.

Um instantâneo capturado

Uma sutileza importante: a referência ao delegado é capturada quando o objeto é construído. Os membros substituídos chamam o delegado explicitamente, mas os encaminhadores gerados usam a instância fornecida originalmente.

interface Source { fun value(): Int }

class Const(val n: Int) : Source { override fun value() = n }

class Wrapper(s: Source) : Source by s

fun main() {
    val w = Wrapper(Const(42))
    println(w.value())
}

Por que usar by

A palavra-chave by permite que você:

  • Reutilize implementações existentes
  • Adicione comportamento sem criar subclasses
  • Evite hierarquias de herança frágeis

É o suporte de primeira classe da linguagem Kotlin ao princípio de preferir composição à herança.

A base

Esta palavra-chave by é a base de tudo neste curso. A seguir, veremos mais de perto como delegar para objetos membros a fim de compor comportamentos.

Verificação rápida

Teste sua compreensão sobre a palavra-chave de delegação.

Recapitulação

Você aprendeu a delegação de classes com by:

  • Delegar uma interface para outro objeto
  • Métodos de encaminhamento gerados automaticamente
  • Substituir membros selecionados e encaminhar os demais
  • Funciona também com interfaces integradas

A seguir: delegação para membros a fim de compor comportamentos.

Perguntas Frequentes

A aula “A Palavra-chave by” é grátis?

Sim — o texto completo de “A Palavra-chave by” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Kotlin Academy, atualize para CoddyKit PRO. O curso de Kotlin Academy inclui 4 aulas no total.

O que vou aprender em “A Palavra-chave by”?

Delegue a implementação da interface Você pratica Kotlin Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Kotlin Academy?

Nenhuma experiência prévia é necessária. Kotlin Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “A Palavra-chave by”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Kotlin Academy?

Sim. Cada aula de Kotlin Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A Palavra-chave by
  2. Delegação a Membros
  3. Delegação versus Herança
  4. Padrões Práticos
← Voltar para Kotlin Academy