Делегирование интерфейса в Kotlin
Делегирование интерфейса позволяет не писать
тело каждого метода интерфейса: класс объявляет
: SomeInterface by delegate, и все нереализованные
методы интерфейса автоматически вызывают одноимённые
методы объекта delegate. Класс подключает
готовую реализацию, а делегат остаётся отдельным
объектом.
Сначала описывают интерфейс и класс с реализацией, затем - класс-обёртку с делегированием:
interface Printer {
fun printLine(text: String)
}
class ConsolePrinter : Printer {
override fun printLine(text: String) {
println(text)
}
}
class Logger(b: Printer) : Printer by b
fun main() {
val logger = Logger(ConsolePrinter())
logger.printLine("ready")
}
Параметр конструктора b должен реализовывать
тот же интерфейс. Можно передать другую реализацию
без изменения Logger:
class QuietPrinter : Printer {
override fun printLine(text: String) {
// no output
}
}
fun main() {
val logger = Logger(QuietPrinter())
logger.printLine("hidden")
}
Несколько интерфейсов делегируют разным объектам
в одном заголовке класса - каждый блок by
связан со своим параметром конструктора.
Объявите интерфейс Greeter с методом
greet(name: String): String. Реализуйте его
в SimpleGreeter - строка "hi, "
и имя. Объявите class Welcome(g: Greeter) :
Greeter by g. Выведите результат
Welcome(SimpleGreeter()).greet("Ann").