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
- A Palavra-chave by
- Delegação a Membros
- Delegação versus Herança
- Padrões Práticos