Sobes.tech
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.
  • when ile kullanımı:
    • Sealed türü ile when kullanıldığında, derleyici tüm olası alt tiplerin dikkate alındığını kontrol edebilir, bu da when ifadesini tam yapar ve tüm alt tipler işlendiğinde else bloğunun açıkça belirtilmesine gerek kalmaz.
    • Soyut sınıflarda, derleyici tamlığı garanti edemediği için genellikle else gerekebilir.
  • Ö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, when ifadelerinde 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.