CodeBlanks Logo Icon CodeBlanks

OOP modeli

Sınıf hiyerarşisi ve interface'leri kurarsın.

Sealed class: Category

Kitapları kategorilere ayırmak için bir sealed class tanımlayacaksın. Sealed class, sınırlı sayıda alt türü olan hiyerarşi kurar; when ifadelerinde tüketici tükenirliği sağlar. Burada iki kategori kullanacaksın: Fiction (Roman) ve NonFiction (İnceleme).

sealed class Category {
    abstract fun label(): String
}

object Fiction : Category() {
    override fun label() = "Roman"
}

Her alt tür (object), Category'den miras alır ve label metodunu uygular. object ile tek örnek (singleton) tanımlanır; her kategori için yalnızca bir nesne vardır. Book sınıfına category: Category özelliği eklenecek ve format kategori etiketini gösterecek.

Book'a category ekle

Book sınıfına category: Category özelliği eklenir. format metodu kategori etiketini de gösterir: "$title - $author ($year) [${category.label()}]". Böylece kitabın türü de çıktıda görünür.

val b = Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction)
println(b.format())
// Suç ve Ceza - Dostoyevski (1866) [Roman]

Burada Fiction object'i kategori olarak verilir; label() çağrısı "Roman" döndürür. Sealed class sayesinde derleyici, Category'nin yalnızca Fiction ve NonFiction olduğunu bilir; bu, when ifadelerinde güvenlik sağlar. İleride yeni kategori eklemek için sealed class'a yeni bir object eklemek yeterlidir.

Uygulama Category sealed class ve Book'u birleştir

Hazır koddaki Book sınıfı zaten category: Category özelliği içeriyor. Sen sealed class Category tanımla; içinde abstract fun label(): String olsun. object Fiction : Category() ve object NonFiction : Category() tanımla; her biri label() metodunu geçersiz kılsın (Fiction için "Roman", NonFiction için "İnceleme"). main içinde birer Fiction ve NonFiction kitap oluştur ve println(b.format()) ile yazdır.

Başlangıç kodu

Main.kt
data class Book(val title: String, val author: String, val year: Int, val category: Category) {
    fun format(): String = "$title - $author ($year) [${category.label()}]"
}

// Category sealed sınıfı tanımla: Fiction ve NonFiction object alt türleri
// label() metodu: Fiction için "Roman", NonFiction için "İnceleme" döndürsün
// main: birer Fiction ve NonFiction örneği oluştur ve format çıktılarını yazdır
fun main() {
    // buraya yaz
}

Örnek çözüm

Main.kt
data class Book(val title: String, val author: String, val year: Int, val category: Category) {
    fun format(): String = "$title - $author ($year) [${category.label()}]"
}

sealed class Category {
    abstract fun label(): String
}

object Fiction : Category() {
    override fun label() = "Roman"
}

object NonFiction : Category() {
    override fun label() = "İnceleme"
}

fun main() {
    val b1 = Book("Suç ve Ceza", "Dostoyevski", 1866, Fiction)
    val b2 = Book("Sapiens", "Harari", 2011, NonFiction)
    println(b1.format())
    println(b2.format())
}

Beklenen çıktı

Suç ve Ceza - Dostoyevski (1866) [Roman]
Sapiens - Harari (2011) [İnceleme]

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sealed class hangi avantajı sağlar?

  • Sınırsız alt tür
  • Daha az bellek kullanımı
  • Daha hızlı derleme
  • Sınırlı alt tür ve when tüketici tükenirliği Doğru cevap

Açıklama: Sealed class, sınırlı alt türlerle when'de tükenirlik sağlar.

2 Sealed class bildir

Soru
____ class Category {
    abstract fun label(): String
}
Cevap
sealed class Category {
    abstract fun label(): String
}

Açıklama: sealed class Category ile sınırlı hiyerarşi kurulur.

3 Category parçalarını eşle

Kavram Anlamı
sealed class Category Sınırlı hiyerarşi
object Fiction Tek örnek alt tür
override fun label() Etiket metodu
"Roman" Fiction etiketi

Orta seviye bölümündeki tüm dersler