Kotlin Academy · Lezione

La keyword by

Deleghi l'implementazione delle interfacce

Lezione 1 di 413 passaggi

La keyword by è una lezione Kotlin Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Kotlin Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Kotlin Academy include 4 lezioni in totale.

Che cos'è la delegazione?

La delegazione di classi consente a un oggetto di affidare a un altro oggetto l'implementazione di un'interfaccia. Kotlin integra questa funzionalità nel linguaggio tramite la parola chiave by.

È composizione resa semplice.

Un'interfaccia da delegare

Si inizi con un'interfaccia e un'implementazione concreta. In seguito delegheremo a questa implementazione.

interface Speaker {
    fun speak(): String
}

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

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

La parola chiave by

Scriva class X(d: Iface) : Iface by d. Il compilatore genera metodi di inoltro che chiamano d per ogni membro dell'interfaccia.

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

Nessun boilerplate

Senza by sarebbe necessario scrivere manualmente un metodo di inoltro per ogni funzione dell'interfaccia. La delegazione li genera tutti 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())
}

Eseguire l'override di membri selezionati

È possibile eseguire l'override solo dei membri da personalizzare; gli altri vengono comunque inoltrati al delegato.

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

Il delegato come parametro

Il delegato viene solitamente passato tramite il costruttore primario. È possibile conservarne un riferimento con private val se si esegue l'override anche di alcuni membri.

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

Delegare interfacce standard

È possibile delegare a interfacce di raccolta integrate, ottenendo immediatamente un wrapper che si comporta come la raccolta sottostante.

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

Come viene compilata

Dietro le quinte, il compilatore memorizza il delegato e genera implementazioni di inoltro. I metodi generati chiamano semplicemente il metodo corrispondente del delegato. È come scrivere manualmente l'inoltro, ma senza dover digitare tutto.

Uno snapshot acquisito

Una sottigliezza importante: il riferimento al delegato viene acquisito quando l'oggetto viene creato. I membri sottoposti a override chiamano esplicitamente il delegato, mentre i metodi di inoltro generati usano l'istanza fornita originariamente.

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

Perché usare by

La parola chiave by consente di:

  • Riutilizzare implementazioni esistenti
  • Aggiungere comportamento senza ricorrere all'ereditarietà
  • Evitare gerarchie di ereditarietà fragili

È il supporto di prima classe di Kotlin al principio di preferire la composizione all'ereditarietà.

Le fondamenta

Questa parola chiave by è alla base di tutto il corso. Nel prossimo argomento esamineremo più da vicino la delegazione a oggetti membri per comporre il comportamento.

Verifica rapida

Verifichi la sua comprensione della parola chiave by.

Riepilogo

Ha imparato la delegazione di classi con by:

  • Delegare un'interfaccia a un altro oggetto
  • Metodi di inoltro generati automaticamente
  • Eseguire l'override di membri selezionati inoltrando gli altri
  • Funziona anche con le interfacce integrate

Prossimo argomento: delegare a membri per comporre il comportamento.

Gratis per iniziare

Impara Kotlin con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
51
Lezioni
203

Domande Frequenti

La lezione «La keyword by» è gratuita?

Sì — il testo completo di «La keyword by» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Kotlin Academy, passa a CoddyKit PRO. Il corso Kotlin Academy include 4 lezioni in totale.

Cosa imparerò in «La keyword by»?

Deleghi l'implementazione delle interfacce Eserciti Kotlin Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Kotlin Academy?

Non è richiesta alcuna esperienza precedente. Kotlin Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «La keyword by»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Kotlin Academy?

Sì. Ogni lezione Kotlin Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. La keyword by
  2. Delega ai membri
  3. Delega e ereditarietà
  4. Pattern pratici
← Torna a Kotlin Academy