Практика на делегирование в Kotlin
Даны типы:
interface Countable {
fun count(): Int
}
class ListCount(private val data: List<Int>) : Countable {
override fun count(): Int = data.size
}
class CountProxy(c: Countable) : Countable by c
Создайте CountProxy для списка из трёх чисел.
Выведите count().
Даны типы:
interface Logger {
fun log(msg: String)
}
class ConsoleLogger : Logger {
private val lines = mutableListOf<String>()
override fun log(msg: String) {
lines.add(msg)
}
fun dump(): String = lines.joinToString(",")
}
class PrefixLogger(private val base: Logger) : Logger by base {
override fun log(msg: String) {
base.log(">" + msg)
}
}
Запишите "one" в PrefixLogger
над ConsoleLogger. Выведите dump()
консольного логгера.
Дан класс:
class Report {
val body: String by lazy { "ready" }
}
Создайте Report, два раза прочитайте body.
Выведите оба значения в одной строке, разделив пробелом.
Дан класс:
import kotlin.properties.Delegates
class Score {
var points: Int by Delegates.observable(0) { _, _, v ->
if (v >= 5) println("ok")
}
}
Присвойте points значения 2, затем 5.
Зафиксируйте вывод программы.
Дан класс:
class Row(map: Map<String, Any?>) {
val id: Int by map
val name: String by map
}
Для карты mapOf("id" to 7, "name" to "Ann")
выведите id и name, разделив пробелом.
Сделайте делегат NonBlank,
который не записывает пустую строку.
Сделайте класс Title
с полем var text: String by NonBlank().
Присвойте "", "a", "", "b".
Выведите итоговый text.
Сделайте интерфейс Readable
с методом fun read(): String.
Сделайте класс FileReader,
который возвращает заданную строку.
Сделайте класс CachedReader(r: Readable) : Readable by r,
который запоминает первый ответ и дальше отдаёт его же.
Два вызова read() подряд - выведите оба.
Дан класс:
class Holder {
var flag: Boolean by Delegates.notNull()
}
Создайте Holder, присвойте flag = true,
выведите flag.
Сделайте интерфейсы A и B
с методом tag(): String.
Сделайте класс Core, реализующий оба.
Сделайте класс Wrap(c: Core):
A by c, B by c.
Пусть Core возвращает "x".
Выведите tag() от Wrap
как A и как B.
Дан класс:
class Settings {
var level: Int by Delegates.vetoable(1) { _, _, new ->
new in 1..3
}
}
Присвойте 2, 5, 3.
Выведите итоговое level.