Generic Sınıflar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 38 / 57.
Bir sınıfın da tür parametreleri olabilir. Box<T> herhangi bir türdeki değeri tutar ve her örnek türü sabitler: bir Box<Int> yalnızca Int değerlerini kabul eder:
class Box<T>(var value: T) {
fun describe() = "box with $value"
}main içinde:
val numberBox = Box(42)
val textBox = Box("hello")
numberBox.value += 1
println(numberBox.describe())
println(textBox.describe())
// numberBox.value = "x" // hata: bir String bir Int değildirÇıktı:
box with 43
box with helloContainer'lar tipik genel sınıflardır. Bir Stack<T> uygulaması her öğe türüyle çalışır ve derleyici, içeri giren ve çıkan türleri denetler:
class Stack<T> {
private val items = mutableListOf<T>()
val size: Int
get() = items.size
fun push(item: T) { items.add(item) }
fun pop(): T? = items.removeLastOrNull()
fun peek(): T? = items.lastOrNull()
}main içinde:
val stack = Stack<String>()
stack.push("a")
stack.push("b")
println(stack.pop())
println(stack.peek())
println(stack.size)Çıktı:
b
a
1Tür bağımsız değişkeni, varsa oluşturucu bağımsız değişkenlerinden çıkarılır; örneğin Box(42). Aksi takdirde türü yazın: Stack<String>(). Farklı tür bağımsız değişkenlerine sahip örnekler farklı türlerdir; bu nedenle bir Stack<String> hiçbir zaman bir Stack<Int> ile karıştırılmaz. Genel bir sınıfın işlevleri de kendilerine ait tür parametreleri ekleyebilir:
class Box<T>(val value: T) {
fun <R> map(f: (T) -> R): Box<R> = Box(f(value))
}main içinde:
val length = Box("kotlin").map { it.length }
println(length.value + 1)Çıktı:
7Genel arayüzler de aynı kuralları izler. Bir sınıf, bir arayüzü genel olarak veya belirli bir tür bağımsız değişkeni için uygulayabilir:
interface Repository<T> {
fun add(item: T)
fun all(): List<T>
}
class MemoryRepository<T> : Repository<T> {
private val items = mutableListOf<T>()
override fun add(item: T) { items.add(item) }
override fun all() = items.toList()
}
class TagRepository : Repository<String> {
private val tags = sortedSetOf<String>()
override fun add(item: String) { tags.add(item.lowercase()) }
override fun all() = tags.toList()
}main içinde:
val ids = MemoryRepository<Int>()
ids.add(3); ids.add(1)
val tags = TagRepository()
tags.add("Kotlin"); tags.add("JVM")
println("${ids.all()} ${tags.all()}")Çıktı:
[3, 1] [jvm, kotlin]Görev
KolaySon limit öğeyi hatırlayan genel sınıf History<T>(limit) sınıfını yazın. add(item) bir öğe ekler ve limit değerinden fazla öğe olduğunda en eski öğeyi çıkarır. latest en yeni öğeyi veya null değerini içerir; all() ise öğeleri eskiden yeniye doğru salt okunur bir liste olarak döndürür. Ardından yalnızca sayı geçmişleri için geçerli olan History<Int>.average() uzantısını yazın; bu uzantı tutulan sayıların tamsayı ortalamasını döndürür (boş olduğunda 0).
Sağlanan kod limiti, bir satır kelimeyi ve bir satır sayıyı okur. Bir History<String> ve bir History<Int> doldurur ve tutulan kelimeleri, en son kelimeyi, tutulan sayıları, bunların ortalamasını ve empty latest: null ifadesini yazdırır.
Kodunuz History.kt dosyasına gider. Main.kt sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
fun main() {
// Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
val input = generateSequence(::readLine).toList()
val limit = input[0].toInt()
val words = History<String>(limit)
for (w in input[1].split(" ")) words.add(w)
val numbers = History<Int>(limit)
for (n in input[2].split(" ")) numbers.add(n.toInt())
println("words: ${words.all()}")
println("latest word: ${words.latest}")
println("numbers: ${numbers.all()}")
println("average: ${numbers.average()}")
println("empty latest: ${History<Char>(3).latest}")
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
Nesne Yönelimli Programlama bölümündeki tüm dersler
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaBirincil Yapıcılarinit Blokları ve Doğrulamaİkincil YapıcılarTekrar - Kütüphane Kartı4Kalıtım
Açık Sınıflar ve Alt SınıflarÜyeleri Geçersiz Kılmasuper ve YapıcılarSoyut SınıflarTekrar - Personel Dizini2Özellikler ve Kapsülleme
Özel ErişimcilerGörünürlük DeğiştiricileriÖzel Setter'larlazy ve lateinitTekrar - Banka Hesabı5Arayüzler
Arayüz BildirimleriVarsayılan MetotlarBirden Çok ArayüzTür Olarak ArayüzlerÖzet - Ödeme Yöntemleri8Generic'ler
Generic FonksiyonlarGeneric SınıflarTür Kısıtlamalarıin ve out ile VaryansTekrar - Öncelik Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Kotlin playground