Middle
Koja je razlika između sealed-klasa i apstraktnih klasa u Kotlinu?
sobes.tech АИ
Одговор од АИ
Glavna razlika između sealed klasa i apstraktnih klasa je u tome što sealed klase ograničavaju hijerarhiju nasleđivanja na nivo jednog fajla ili modula (za Kotlin 1.5+). Naslednici sealed klase moraju biti deklarisani u istom fajlu kao i sama sealed klasa, što obezbeđuje potpunu kontrolu pri korišćenju izraza when.
Razlike:
- Nasleđivanje:
- Apstraktne klase mogu biti nasledjene bilo gde u projektu.
- Sealed klase mogu biti nasledjene samo unutar istog fajla (do Kotlin 1.5) ili u okviru istog modula (sa Kotlin 1.5+).
- Korišćenje sa
when:- Pri korišćenju
whensa sealed tipom, kompilator može da proveri da li su svi mogući podtipovi uzeti u obzir, što činiwhenpotpunim i uklanja potrebu za eksplicitnim navodomelsegrane, ako su svi podtipovi obrađeni. - Sa apstraktnim klasama, kompilator ne može garantovati potpunost, pa je često potrebna
elsegrana.
- Pri korišćenju
- Kreiranje instanci:
- Ni apstraktne, ni sealed klase ne mogu biti direktno instancirane.
- Članovi:
- Kao i apstraktne, tako i sealed klase mogu imati apstraktne i neapstraktne članove.
Primer sealed klase:
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 -> {
// Obrada uspešnog rezultata
println("Success: ${result.data}")
}
is Result.Error -> {
// Obrada greške
println("Error: ${result.message}")
}
// Nije potrebna else, ako su svi naslednici obrađeni
}
}
Primer apstraktne klase:
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()
}
Kada koristiti:
- Sealed klase: Idealne za predstavljanje ograničenog skupa mogućih stanja ili tipova, kada vam je potrebna potpunost u
whenizrazima. Često se koriste za modeliranje rezultata operacija (uspeh/greska), stanja UI, događaja. - Apstraktne klase: Pogodne za definisanje opšte funkcionalnosti i ugovora za grupu povezanih klasa, koje mogu biti nasledjene bilo gde u projektu.
Ukratko, sealed klase pružaju strožu kontrolu nad hijerarhijom nasleđivanja i poboljšavaju sigurnost i čitljivost koda pri obradi ograničenog skupa podtipova.