Kotlin Academy · Lektion

Das Schlüsselwort by

Delegieren Sie die Implementierung eines Interfaces

Lektion 1 von 413 Schritte

Das Schlüsselwort by ist eine kostenlose Kotlin Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Kotlin Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist Delegation?

Klassendelegation ermöglicht es einem Objekt, die Implementierung einer Schnittstelle an ein anderes Objekt zu übergeben. Kotlin integriert diese Funktion mit dem Schlüsselwort by direkt in die Sprache.

So wird Komposition mühelos.

Eine zu delegierende Schnittstelle

Beginnen Sie mit einer Schnittstelle und einer konkreten Implementierung. Später delegieren wir an diese Implementierung.

interface Speaker {
    fun speak(): String
}

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

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

Das Schlüsselwort by

Schreiben Sie class X(d: Iface) : Iface by d. Der Compiler erzeugt Weiterleitungsmethoden, die für jedes Schnittstellenmitglied d aufrufen.

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

Kein Boilerplate-Code

Ohne by müssten Sie für jede Schnittstellenfunktion von Hand eine Weiterleitungsmethode schreiben. Die Delegation erzeugt alle diese Methoden automatisch.

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

Ausgewählte Mitglieder überschreiben

Sie können nur die Mitglieder überschreiben, die Sie anpassen möchten; die übrigen werden weiterhin an den Delegaten weitergeleitet.

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

Den Delegaten als Parameter übergeben

Der Delegat wird normalerweise über den primären Konstruktor übergeben. Mit private val können Sie eine Referenz speichern, wenn Sie zusätzlich einige Mitglieder überschreiben.

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

An Standardschnittstellen delegieren

Sie können an integrierte Sammlungsschnittstellen delegieren und erhalten so sofort einen Wrapper, der sich wie die zugrunde liegende Sammlung verhält.

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

Wie es kompiliert wird

Hinter den Kulissen speichert der Compiler den Delegaten und erzeugt Weiterleitungsimplementierungen. Die generierten Methoden rufen einfach die entsprechende Methode des Delegaten auf. Das entspricht einer von Hand geschriebenen Weiterleitung – nur ohne den Schreibaufwand.

Eine erfasste Momentaufnahme

Wichtige Feinheit: Die Referenz auf den Delegaten wird beim Erstellen des Objekts erfasst. Überschriebene Mitglieder rufen den Delegaten explizit auf, während generierte Weiterleitungen die ursprünglich übergebene Instanz verwenden.

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

Warum by verwenden?

Mit dem Schlüsselwort by können Sie:

  • Vorhandene Implementierungen wiederverwenden
  • Verhalten hinzufügen, ohne Unterklassen zu bilden
  • Fragile Vererbungshierarchien vermeiden

Damit bietet Kotlin erstklassige Unterstützung für das Prinzip „Komposition vor Vererbung“.

Die Grundlage

Dieses Schlüsselwort by bildet die Grundlage für alles in diesem Kurs. Als Nächstes sehen wir uns genauer an, wie Sie an Memberobjekte delegieren, um Verhalten zu komponieren.

Kurzer Test

Testen Sie Ihr Verständnis des Schlüsselworts by.

Zusammenfassung

Sie haben Klassendelegation mit by kennengelernt:

  • Eine Schnittstelle an ein anderes Objekt delegieren
  • Automatisch generierte Weiterleitungsmethoden
  • Ausgewählte Mitglieder überschreiben und die übrigen weiterleiten
  • Funktioniert auch mit integrierten Schnittstellen

Als Nächstes: Delegation an Member zur Komposition von Verhalten.

Kostenlos starten

Lerne Kotlin mit einem KI-Tutor — kostenlos

Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.

Kurse
51
Lektionen
203

Häufig gestellte Fragen

Ist die Lektion „Das Schlüsselwort by“ kostenlos?

Ja — der vollständige Text von „Das Schlüsselwort by“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Kotlin Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Kotlin Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Das Schlüsselwort by“?

Delegieren Sie die Implementierung eines Interfaces Du übst Kotlin Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Kotlin Academy zu starten?

Keine Vorkenntnisse erforderlich. Kotlin Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Das Schlüsselwort by“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Kotlin Academy-Lektion Code schreiben und ausführen?

Ja. Jede Kotlin Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Das Schlüsselwort by
  2. Delegation an Member
  3. Delegation oder Vererbung
  4. Praktische Muster
← Zurück zu Kotlin Academy