Delegacja interfejsu generuje metody przekazujące wywołania do obiektu delegata: `class X(private val d: Foo) : Foo by d`. Zmniejsza boilerplate. Ograniczenie: jeśli chcesz zmienić zachowanie, musisz jawnie nadpisać metody; to nie jest “magiczne dziedziczenie” i nie przechwyci metod, których nie nadpiszesz.
interface Logger { fun log(msg: String) }
class ConsoleLogger : Logger {
override fun log(msg: String) = println(msg)
}
class Service(private val logger: Logger) : Logger by logger {
fun work() = log("working")
}