Sobes.tech
Middle

Kotlin'da sealed sinflar va abstrakt sinflar o'rtasidagi farq nima?

sobes.tech AI

AIdan javob

Sealed sinflar va abstrakt sinflar o'rtasidagi asosiy farq shundaki, sealed sinflar merosxo'rlik ierarxiyasini bitta fayl yoki modul bilan cheklaydi (Kotlin 1.5+ uchun). Sealed sinfning vorislari, sealed sinf bilan bir xil faylda e'lon qilinishi kerak, bu when ifodalarida to'liq tekshirishni ta'minlaydi.

Farqlar:

  • Merosxo'rlik:
    • Abstrakt sinflar har qanday joyda meros qilib olinishi mumkin.
    • Sealed sinflar faqat bir xil faylda (Kotlin 1.5 oldin) yoki bir xil modulda (Kotlin 1.5+) meros qilib olinishi mumkin.
  • when bilan foydalanish:
    • Sealed tur bilan when ishlatilganda, kompilyator barcha mumkin bo'lgan pastki turlarni hisobga olganligini tekshirishi mumkin, bu when ni to'liq qiladi va agar barcha pastki turlar ishlov berilgan bo'lsa, else bo'lagi aniq ko'rsatilishini talab qilmaydi.
    • Abstrakt sinflar bilan, kompilyator to'liqlikni kafolatlamaydi, shuning uchun ko'pincha else kerak bo'ladi.
  • Namuna yaratish:
    • Na sealed, na abstrakt sinflar to'g'ridan-to'g'ri instansiya qilinishi mumkin emas.
  • A'zolar:
    • Ikkala sinf ham abstrakt va abstrakt bo'lmagan a'zolarga ega bo'lishi mumkin.

Sealed sinf misoli:

sealed class Result<out T> {
    data class Success<out T>(val data: T) : Result<T>()
    data class Error(val message: String) : Result<Nothing>()
}

fun processResult(result: Result<Int>) {
    when (result) {
        is Result.Success -> {
            // Muvaffaqiyatli natijani ishlash
            println("Muvaffaqiyat: ${result.data}")
        }
        is Result.Error -> {
            // Xatoni ishlash
            println("Xato: ${result.message}")
        }
        // Agar barcha vorislar ishlov berilgan bo'lsa, else kerak emas
    }
}

Abstrakt sinf misoli:

abstract class Shape {
    abstract fun area(): Double
}

class Circle(val radius: Double) : Shape() {
    override fun area(): Double = Math.PI * radius * radius
}

class Rectangle(val width: Double, val height: Double) : Shape() {
    override fun area(): Double = width * height
}

fun calculateArea(shape: Shape): Double {
    return shape.area()
}

Qachon foydalanish kerak:

  • Sealed sinflar: Cheklangan holatlar yoki turlar to'plamini ifodalash uchun ideal, when ifodalarida to'liq tekshirish talab qilinadigan hollarda. Ko'pincha operatsiya natijalarini (muvaffaqiyat/xato), UI holatlarini, voqealarni modellashtirish uchun ishlatiladi.
  • Abstrakt sinflar: Umumiy funksionallik va shartlarni belgilash uchun mos, ular har qanday joyda meros qilib olinishi mumkin.

Xulosa qilib aytganda, sealed sinflar merosxo'rlik ierarxiyasini yanada qat'iy nazorat qilish imkonini beradi va cheklangan turdagi pastki turlar bilan ishlashda xavfsizlik va o'qilishi yaxshilanadi.