Sobes.tech
Middle

Kotlin-də sealed siniflər və abstrakt siniflər arasındakı fərq nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Sealed sinflar ilə abstrakt sinflər arasındakı əsas fərq odur ki, sealed sinflar irsiyyət ierarxiyasını yalnız bir fayl və ya modul daxilində məhdudlaşdırır (Kotlin 1.5+ üçün). Sealed sinfinin törəmələri, sealed sinfinin özü ilə eyni faylda elan edilməlidir, bu da when ifadələrindən istifadə edərkən tam yoxlamanı təmin edir.

Fərqlər:

  • İrsiyyət:
    • Abstrakt sinflər istənilən yerdə layihədə irs edilə bilər.
    • Sealed sinflər yalnız eyni faylda (Kotlin 1.5-dən əvvəl) və ya eyni modul daxilində (Kotlin 1.5+ ilə) irs edilə bilər.
  • when ilə istifadə:
    • Sealed tip ilə when istifadə edildikdə, tərtibçi bütün mümkün alt tipləri nəzərə alıb-almadığını yoxlaya bilər, bu da when-i tam edir və bütün alt tiplər işlənmişsə, else şərtini açıq göstərməyə ehtiyac qalmır.
    • Abstrakt sinflərlə, tərtibçi tamlığı təmin edə bilməz, buna görə də çox vaxt else tələb olunur.
  • Nümunələr yaratmaq:
    • Nə sealed, nə də abstrakt sinflər birbaşa nümunə kimi istifadə oluna bilməz.
  • Üzvlər:
    • Həm abstrakt, həm də sealed sinflər abstrakt və qeyri-abstrakt üzvlərə sahib ola bilər.

Sealed sinf nümunəsi:

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 -> {
            // Uğurlu nəticənin işlənməsi
            println("Uğur: ${result.data}")
        }
        is Result.Error -> {
            // Xəta işlənməsi
            println("Xəta: ${result.message}")
        }
        // Bütün törəmələr işlənibsə, else lazım deyil
    }
}

Abstrakt sinf nümunəsi:

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()
}

Nə zaman istifadə etmək:

  • Sealed sinflər: Məhdud bir vəziyyət və ya tiplər toplusunu təmsil etmək üçün idealdır, when ifadələrində tam yoxlama tələb olunduqda. Əməliyyat nəticələrinin (uğur/xəta), UI vəziyyətlərinin, hadisələrin modelləşdirilməsi üçün geniş istifadə olunur.
  • Abstrakt sinflər: Ümumi funksionallıq və müqavilələri təyin etmək üçün uyğundur, hər yerdə irs edilə bilər.

Qısaca, sealed sinflar irsiyyət ierarxiyasına daha sərt nəzarət təmin edir və məhdud alt tiplər toplusu ilə işləyərkən təhlükəsizlik və oxunaqlılığı artırır.