Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktOpDlOv 107 of 123 menu
◀ ▶

Переопределение при делегировании в 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 работает без вывода.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить