Middle
Care este diferența dintre clasele sealed și clasele abstracte în Kotlin?
sobes.tech AI
Răspuns de la AI
Principala diferență între clasele sealed și cele abstracte este că clasele sealed limitează ierarhia de moștenire la un singur fișier sau modul (pentru Kotlin 1.5+). Moștenitorii unei clase sealed trebuie să fie declarați în același fișier cu clasa sealed, ceea ce asigură o verificare exhaustivă atunci când se folosesc expresiile when.
Diferențe:
- Moștenire:
- Clasele abstracte pot fi moștenite oriunde în proiect.
- Clasele sealed pot fi moștenite doar în același fișier (înainte de Kotlin 1.5) sau în același modul (cu Kotlin 1.5+).
- Utilizare cu
when:- Când se folosește
whencu un tip sealed, compilatorul poate verifica dacă toate subtipurile posibile au fost luate în considerare, făcândwhenexhaustiv și eliminând necesitatea de a specifica explicit o ramurăelsedacă toate subtipurile sunt gestionate. - Cu clasele abstracte, compilatorul nu poate garanta exhaustivitatea, așa că adesea este nevoie de un
else.
- Când se folosește
- Crearea de instanțe:
- Nici clasele abstracte, nici cele sealed nu pot fi instantiate direct.
- Membri:
- Atât clasele abstracte, cât și cele sealed pot avea membri abstracti și non-abstracti.
Exemplu de clasă sealed:
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 -> {
// Procesare rezultat de succes
println("Succes: ${result.data}")
}
is Result.Error -> {
// Procesare eroare
println("Eroare: ${result.message}")
}
// Nu este nevoie de else dacă toate subtipurile sunt gestionate
}
}
Exemplu de clasă abstractă:
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()
}
Când să folosiți:
- Clase sealed: Ideale pentru reprezentarea unui set limitat de stări sau tipuri posibile, când aveți nevoie de o verificare exhaustivă în expresiile
when. Sunt frecvent utilizate pentru modelarea rezultatelor operațiilor (succes/eroare), stări UI, evenimente. - Clase abstracte: Potrivite pentru definirea funcționalității generale și a contractelor pentru un grup de clase legate, care pot fi moștenite oriunde în proiect.
În concluzie, clasele sealed oferă un control mai strict asupra ierarhiei de moștenire și îmbunătățesc siguranța și lizibilitatea codului atunci când se gestionează un set limitat de subtipuri.