La palabra clave by
Delegue la implementación de interfaces
La palabra clave by es una lección gratuita de Kotlin Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Kotlin Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué es la delegación?
La delegación de clases permite que un objeto ceda a otro la implementación de una interfaz. Kotlin incorpora esta posibilidad al lenguaje mediante la palabra clave by.
Es composición sin esfuerzo.
Una interfaz para delegar
Comience con una interfaz y una implementación concreta. Más adelante delegaremos en esta implementación.
interface Speaker {
fun speak(): String
}
class LoudSpeaker : Speaker {
override fun speak() = "HELLO!"
}
fun main() {
println(LoudSpeaker().speak())
}La palabra clave by
Escriba class X(d: Iface) : Iface by d. El compilador genera métodos de reenvío que llaman a d para cada miembro de la interfaz.
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())
}Sin código repetitivo
Sin by, tendría que escribir a mano un método de reenvío para cada función de la interfaz. La delegación los genera todos automáticamente.
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())
}Sobrescribir miembros seleccionados
Puede sobrescribir solo los miembros que quiera personalizar; el resto se sigue reenviando al 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())
}El delegado como parámetro
Normalmente, el delegado se pasa mediante el constructor primario. Puede conservar una referencia con private val si también sobrescribe algunos miembros.
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())
}Delegar interfaces estándar
Puede delegar en interfaces de colecciones integradas y obtener al instante un envoltorio que se comporta como la colección subyacente.
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)
}Cómo se compila
Internamente, el compilador almacena el delegado y emite implementaciones de reenvío. Los métodos generados simplemente llaman al método correspondiente del delegado. Es lo mismo que escribir el reenvío a mano, pero sin tener que escribirlo.
Una instantánea capturada
Una sutileza importante: la referencia al delegado se captura cuando se construye el objeto. Los miembros sobrescritos llaman explícitamente al delegado, pero los métodos de reenvío generados usan la instancia suministrada 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 qué usar by
La palabra clave by le permite:
- Reutilizar implementaciones existentes
- Añadir comportamiento sin crear subclases
- Evitar jerarquías de herencia frágiles
Es la compatibilidad de primer nivel de Kotlin con el principio de composición sobre herencia.
La base
Esta palabra clave by es la base de todo el curso. A continuación, analizaremos con más detalle la delegación a objetos miembros para componer comportamiento.
Comprobación rápida
Compruebe su comprensión de la palabra clave by.
Recapitulación
Ha aprendido la delegación de clases con by:
- Delegar una interfaz en otro objeto
- Métodos de reenvío generados automáticamente
- Sobrescribir miembros seleccionados y reenviar el resto
- También funciona con interfaces integradas
A continuación: delegar en miembros para componer comportamiento.
Preguntas frecuentes
¿La lección «La palabra clave by» es gratis?
Sí — el texto completo de «La palabra clave by» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Kotlin Academy, actualiza a CoddyKit PRO. El curso de Kotlin Academy incluye 4 lecciones en total.
¿Qué aprenderé en «La palabra clave by»?
Delegue la implementación de interfaces Practicas Kotlin Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Kotlin Academy?
No se requiere experiencia previa. Kotlin Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.
¿Cuánto tiempo toma la lección «La palabra clave by»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Kotlin Academy?
Sí. Cada lección de Kotlin Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- La palabra clave by
- Delegación a miembros
- Delegación frente a herencia
- Patrones prácticos