Переопределение при делегировании в Kotlin
Запись : Interface by obj не запрещает собственные
методы в классе. Если объявить override fun ...
для члена интерфейса, вызов пойдёт в вашу реализацию,
а не в делегат. Остальные методы интерфейса по-прежнему
перенаправляются объекту obj.
Типичный приём - обернуть делегат и добавить лог или проверку только для одной операции:
interface Repository {
fun load(id: Int): String
fun save(id: Int, data: String)
}
class MemoryRepo : Repository {
private val store = mutableMapOf<Int, String>()
override fun load(id: Int): String =
store[id] ?: ""
override fun save(id: Int, data: String) {
store[id] = data
}
}
class LoggingRepo(r: Repository) : Repository by r {
override fun save(id: Int, data: String) {
println("save $id")
r.save(id, data)
}
}
В override можно явно обратиться к параметру
делегата r, как в примере выше. Метод
load не переопределён - его по-прежнему
обслуживает by r.
Объявите interface Calc с add
и mul. Реализуйте в BasicCalc.
Объявите class AuditCalc(c: Calc) : Calc by c
и переопределите только add - перед
сложением выведите строку "add".
Проверьте, что mul работает без вывода.