OOP modeli
- Kotlin kursu
- Orta seviye
- Ders 113/116
- 6 dk
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
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
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
____ class Category {
abstract fun label(): String
}
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 |