Перейти до вмісту

Освоюємо Kotlin/Sealed класи

Матеріал з Вікіпідручника


Sealed класи (перекладається як запечатані класи) та sealed інтерфейси - це альтернатива Enum класам. Проте на відміну від перелічень, де всі об'єкти перелічення мають однакову сигнатуру, запечатані класи дозволяють згрупувати різні об'єкти. Вважається, що sealed класи кращі за Enum класи. Вони дозволяють утворити чітку ієрархію спадкування, що відома вже на етапі компіляції.

Як приклад розглянемо sealed клас Payment:

sealed class Payment {
    data class CreditCard(val number: String, val expiryDate: String) : Payment()
    data class PayPal(val email: String) : Payment()
    data object Cash : Payment()
}

fun processPayment(payment: Payment) {
    when (payment) {     //в залежності від типу об'єкту будуть здійсненні відповідні дії
        is Payment.CreditCard -> processCreditCardPayment(payment.number, payment.expiryDate)
        is Payment.PayPal ->  processPayPalPayment(payment.email)
        is Payment.Cash -> processCashPayment()
    }
}
fun processCreditCardPayment(number:String, expiryDate:String){
    println ("Processing card payment. Card number: $number, ExpiredDate: $expiryDate")
}

fun processPayPalPayment(email:String){
    println("Processing PayPal payment using $email")
}
fun processCashPayment(){
    println("Processing cash payment...")
}
fun main(){
    val payment=Payment.PayPal("my@card.ua")
    processPayment(payment)
}
Standard input or output Результат:
Processing PayPal payment using my@card.ua

Наш запечатаний клас Payment містить два класи даних і один об'єкт Cash, які є нащадками цього ж класу Payment. Як бачимо у функції main() ми створюємо один з об'єктів sealed класу, який і передається у функцію processPayment(). У функції з допомогою конструкції when, в залежності від того, що за об'єкт, відбувається відповідна дія. Так може відбутися: 1)оплата з використанням даних кредитної карточки; 2) з використанням PayPal і 3) з використанням готівки. В нашому випадку буде здійсненна оплата з використанням PayPal. Як і у випадку з Enum класам у конструкції when потрібно опрацювати усі можливі випадки, або ж використати else.

Детальніше

[ред.]