Объявление sealed class в Kotlin
Ключевое слово Sealed class задаёт родительский тип с заранее
известным полным набором подтипов. Наследование здесь
оформляют так же, как от open class или
абстрактного родителя, но все потомки объявляют в том
же файле; снаружи файла новый наследник добавить нельзя:
sealed class Result {
data class Ok(val text: String) : Result()
data class Fail(val message: String) : Result()
}
fun main() {
val result: Result = Result.Ok("saved")
println(result)
}
Вариант без данных оформляют как object.
Так отмечают единственное состояние вроде загрузки
или пустого результата:
sealed class LoadState {
object Loading : LoadState()
data class Done(val count: Int) : LoadState()
}
fun main() {
val state: LoadState = LoadState.Loading
println(state)
}
Переменная запечатанного типа может хранить любой из
объявленных подтипов. Проверка типа и разбор по вариантам
удобно делаются в when - компилятор видит весь
список наследников:
sealed class Payment {
data class Card(val last4: String) : Payment()
data class Cash(val amount: Double) : Payment()
}
fun describe(p: Payment): String = when (p) {
is Payment.Card -> "card ${p.last4}"
is Payment.Cash -> "cash ${p.amount}"
}
fun main() {
println(describe(Payment.Card("4242")))
}
Объявите sealed class Answer с вариантами
Yes и No как object.
Сохраните Yes в переменную reply
и выведите ее.
Объявите sealed class Mail:
Inbox с полем unread: Int,
Sent с полем total: Int.
Создайте Mail.Inbox(3), сохраните в
box и выведите число unread.