Смешанная практика ООП в Kotlin
Сделайте data class Line
с полями sku и price.
Сделайте open class Cart
с методом total(lines: List<Line>): Int.
Сделайте DiscountCart, который возвращает
сумму price минус 10,
но не ниже 0.
Дан список:
val items = listOf(
Line("a", 30),
Line("b", 5),
)
Выведите итог для Cart и для DiscountCart.
Сделайте sealed class Auth
с вариантами Guest как object
и User с полем name: String.
Сделайте интерфейс Greeter
с методом fun greet(): String.
Сделайте класс Portal(a: Auth) : Greeter,
который возвращает "hello guest"
или "hello " и имя.
Выведите оба варианта.
Даны типы:
interface HasArea {
val area: Double
}
data class Rect(val w: Double, val h: Double) : HasArea {
override val area: Double = w * h
}
enum class UnitTag { PLAIN, MARKED }
Соберите список HasArea из двух Rect
и одной анонимной реализации с area = 1.0.
Выведите сумму площадей и значение
UnitTag.MARKED.
Сделайте абстрактный класс Storage
с абстрактным методом abstract fun size(): Int.
Сделайте ListStorage, который оборачивает
список строк.
В companion object Storage храните счётчик
созданных хранилищ.
Создайте два ListStorage,
выведите счётчик и оба size().
Сделайте интерфейс Clock
с методом fun now(): String.
Сделайте FixedClock(private val t: String) : Clock
и ClockView(c: Clock) : Clock by c.
Сделайте анонимную обёртку над ClockView,
которая дописывает "!" к now().
Выведите время для "09:00".
В пакете billing сделайте
data class Invoice с полями
id и sum.
В том же пакете сделайте object Registry
с картой Long - Invoice.
Запишите счёт 1 на сумму 100,
прочитайте по id и выведите sum.
Сделайте enum class Role
с константами VIEWER и EDITOR.
Сделайте открытый класс Account с параметром
конструктора role: Role и открытым методом
canEdit(), который возвращает true
только для Role.EDITOR.
Сделайте класс AdminAccount, наследующий
Account(Role.EDITOR) и переопределяющий
canEdit() так, чтобы метод всегда
возвращал true.
Выведите три результата canEdit():
Account(Role.VIEWER), Account(Role.EDITOR),
AdminAccount().
Дан класс:
import kotlin.properties.Delegates
class Profile(map: Map<String, Any?>) {
val city: String by map
var score: Int by Delegates.observable(0) { _, _, v ->
if (v > 10) city
}
}
Исправьте класс: при росте score выше 10
на экран должна выводиться строка city.
Проверьте на карте mapOf("city" to "Rome")
и присвоениях 5, 11.
Сделайте sealed class Msg
с вариантами Text(body: String)
и Ping как object.
Сделайте class Inbox, который хранит
List<Msg> и метод textCount(): Int -
число сообщений Text.
Дан inbox из Ping, Text("a"),
Text("b"). Выведите счётчик.
Сделайте интерфейс Ident
с полем val id: Long.
Сделайте data class Task(override val id: Long, val title: String)
: Ident.
Напишите функцию pickTitle(list: List<Ident>, id: Long): String?,
которая находит заголовок задачи по id.
Дан список из двух Task. Выведите заголовок
для id = 2 и для id = 9.
Сделайте data class Version(major, minor).
Сделайте object Release, который хранит
Version? и метод set(v: Version).
Сделайте open class Tool { open fun label(): String = "tool" }.
Сделайте VersionTool : Tool(),
который выводит "tool " и major
из текущего Release, если версия задана,
иначе "tool ?".
Установите Version(2, 1)
и выведите label().