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

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

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