Sobes.tech
Middle

Mi a különbség a sealed osztályok és az absztrakt osztályok között Kotlinban?

sobes.tech MI

Válasz az MI-től

A sealed osztályok és az absztrakt osztályok közötti fő különbség az, hogy a sealed osztályok korlátozzák az öröklődési hierarchiát egy fájl vagy modul szintjén (Kotlin 1.5+ esetén). A sealed osztály leszármazottjainak ugyanabban a fájlban kell lenniük, mint maga a sealed osztály, ez biztosítja a teljes körű ellenőrzést when kifejezések használatakor.

Különbségek:

  • Öröklődés:
    • Az absztrakt osztályokat bárhol örökölhetjük a projektben.
    • A sealed osztályokat csak ugyanazon a fájlon belül (Kotlin 1.5 előtt) vagy ugyanazon a modullal (Kotlin 1.5+ esetén) lehet örökölni.
  • Használat when-nel:
    • A sealed típusú változóval a when ellenőrizheti, hogy minden lehetséges altípus figyelembe lett-e véve, így a when teljes körűvé válik, és nem szükséges explicit módon else ágat megadni, ha minden altípus kezelt.
    • Az absztrakt osztályok esetén a fordító nem garantálja a teljességet, ezért gyakran szükség van else-re.
  • Példányosítás:
    • Sealed és absztrakt osztályokat sem lehet közvetlenül példányosítani.
  • Tagok:
    • Mind az absztrakt, mind a sealed osztályok tartalmazhatnak absztrakt és nem absztrakt tagokat.

Példa sealed osztályra:

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 -> {
            // Sikeres eredmény feldolgozása
            println("Siker: ${result.data}")
        }
        is Result.Error -> {
            // Hiba feldolgozása
            println("Hiba: ${result.message}")
        }
        // Nem szükséges else, ha minden leszármazottat kezeltek
    }
}

Példa absztrakt osztályra:

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

Mikor használjuk:

  • Sealed osztályok: Ideálisak a korlátozott állapotok vagy típusok halmazának reprezentálására, amikor teljes körű ellenőrzés szükséges a when-ban. Gyakran használják műveletek eredményeinek (siker/hiba), UI állapotok, események modellezésére.
  • Absztrakt osztályok: Alkalmasak általános funkcionalitás és szerződések meghatározására egy kapcsolódó osztálycsoport számára, amelyeket bárhol örökölhetünk a projektben.

Összefoglalva, a sealed osztályok szigorúbb ellenőrzést biztosítanak az öröklődési hierarchián, és javítják a kód biztonságát és olvashatóságát, amikor korlátozott altípusok halmazával dolgozunk.