Middle
Kotlin'de sealed sınıflar ile soyut sınıflar arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Sealed sınıflar ile soyut sınıflar arasındaki temel fark, sealed sınıfların kalıtım hiyerarşisini tek bir dosya veya modül ile sınırlandırmasıdır (Kotlin 1.5+ için). Sealed sınıfın mirasçıları, sealed sınıfın kendisiyle aynı dosyada tanımlanmalıdır, bu da when ifadeleri kullanılırken tam bir kontrol sağlar.
Farklar:
- Kalıtım:
- Soyut sınıflar, projede herhangi bir yerde kalıtılabilir.
- Sealed sınıflar, yalnızca aynı dosya içinde (Kotlin 1.5 öncesi) veya aynı modül içinde (Kotlin 1.5+) kalıtılabilir.
whenile kullanımı:- Sealed türü ile
whenkullanıldığında, derleyici tüm olası alt tiplerin dikkate alındığını kontrol edebilir, bu dawhenifadesini tam yapar ve tüm alt tipler işlendiğindeelsebloğunun açıkça belirtilmesine gerek kalmaz. - Soyut sınıflarda, derleyici tamlığı garanti edemediği için genellikle
elsegerekebilir.
- Sealed türü ile
- Örnekler oluşturma:
- Ne soyut ne de sealed sınıflar doğrudan örneklendirilemez.
- Üyeler:
- Hem soyut hem de sealed sınıflar soyut ve soyut olmayan üyeler içerebilir.
Sealed sınıf örneği:
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 -> {
// Başarılı sonucu işle
println("Başarı: ${result.data}")
}
is Result.Error -> {
// Hata işle
println("Hata: ${result.message}")
}
// Tüm alt tipler işlendiği için else gerekmez
}
}
Soyut sınıf örneği:
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()
}
Ne zaman kullanmalı:
- Sealed sınıflar: Sınırlı bir durum veya tür kümesini temsil etmek için idealdir,
whenifadelerinde tam kontrol gerektiren durumlar. Sıklıkla operasyon sonuçlarını (başarılı/hata), UI durumlarını, olayları modellemek için kullanılır. - Soyut sınıflar: Ortak işlevsellik ve sözleşme tanımlamak için uygundur, herhangi bir yerde kalıtılabilirler.
Özetle, sealed sınıflar, kalıtım hiyerarşisi üzerinde daha katı kontrol sağlar ve sınırlı alt tipler kümesiyle çalışırken kodun güvenliğini ve okunabilirliğini artırır.