Kotlin
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.
Örnek çözümü göster
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())
}
Kendini test et
-
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
Cevabı göster
Sınırlı alt tür ve when tüketici tükenirliği — Sealed class, sınırlı alt türlerle when'de tükenirlik sağlar.
-
Sealed class bildir
____ class Category {
abstract fun label(): String
}
Cevabı göster
sealed class Category {
abstract fun label(): String
}
-
Category parçalarını eşle
- sealed class Category
- Sınırlı hiyerarşi
- object Fiction
- Tek örnek alt tür
- override fun label()
- Etiket metodu
- "Roman"
- Fiction etiketi
Sıradaki ders: Koleksiyonlar