Soyut Sınıflar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 20 / 57.
Bir abstract sınıf, kendi başına örneği oluşturulamayan bir üst sınıftır. Gövdesi olmayan abstract üyeler tanımlayabilir ve her somut alt sınıf bunları uygulamalıdır:
abstract class Shape(val name: String) {
abstract fun area(): Double
fun describe() = "$name with area ${area()}"
}
class Circle(val r: Double) : Shape("circle") {
override fun area() = 3.14 * r * r
}
class Rect(val w: Double, val h: Double) : Shape("rect") {
override fun area() = w * h
}main içinde:
val shapes: List<Shape> = listOf(Circle(1.0), Rect(2.0, 3.0))
for (s in shapes) println(s.describe())Çıktı:
circle with area 3.14
rect with area 6.0Bir abstract sınıf, abstract anahtar sözcüğü olmadan open durumundadır ve abstract üyeleri de open durumundadır; bu nedenle alt sınıflar yalnızca override yazar. Abstract sınıfın kendisini oluşturmak derlenmez ve bir alt sınıf abstract bir üyeyi dışarıda bırakırsa kendisi de abstract olmalıdır. Üst sınıfın bazı üyeler için kendi başına anlamlı bir davranışı olmadığında abstract sınıf kullanın:
// val s = Shape("blob") // hata: soyut bir sınıfın örneği oluşturulamaz
// class Blob : Shape("blob") // hata: Blob area() metodunu uygulamıyor
abstract class Polygon(name: String) : Shape(name) // tamam: hâlâ abstractBir soyut sınıf, alt sınıfların devraldığı bir kurucuya, duruma ve normal metotlara sahip olabilir. Yaygın bir kullanım, adımları değişen sabit bir prosedür olan şablon metodudur: üst sınıf metodu adımları çalıştırır ve alt sınıflar soyut olanları doldurur:
abstract class Report(val title: String) {
fun render() = "== $title ==\n${body()}\n(${footer()})"
abstract fun body(): String
open fun footer() = "end"
}
class Sales(val total: Int) : Report("Sales") {
override fun body() = "total: $total"
}
class Stock(val items: Int) : Report("Stock") {
override fun body() = "items: $items"
override fun footer() = "counted today"
}main içinde:
println(Sales(420).render())
println(Stock(17).render())Çıktı:
== Sales ==
total: 420
(end)
== Stock ==
items: 17
(counted today)Özet özellikler de aynı şekilde çalışır. Alt sınıf, değeri bir kurucu özelliği, saklanan bir özellik veya bir alıcı olarak sağlar:
abstract class Worker(val name: String) {
abstract val monthly: Int
fun yearly() = monthly * 12
}
class Salaried(name: String, override val monthly: Int) : Worker(name)
class Hourly(name: String, val hours: Int, val rate: Int) : Worker(name) {
override val monthly: Int
get() = hours * rate
}main içinde:
val staff = listOf(Salaried("Ada", 4000), Hourly("Bo", 80, 25))
for (w in staff) println("${w.name}: ${w.yearly()}")Çıktı:
Ada: 48000
Bo: 24000Görev
KolayDiscount soyut bir sınıftır. Soyut amount(price) metodunu bildirir ve fiyat eksi amount(price) değerini döndüren, ancak hiçbir zaman 0'ın altına düşmeyen apply(price) metodunu uygular. Alt sınıfları tamamlayın: PercentOff(percent) fiyatın bu yüzdesini alır (aşağı yuvarlanır), FixedOff(value) sabit bir değer alır ve SpendMore(threshold, off) yalnızca fiyat en az threshold olduğunda off değerini alır.
Sağlanan kod fiyatı okur ve ardından p,10, f,300 veya s,500,50 indirimlerini uygular, her birini fiyata uygular ve 1000 -> 900 çıktısını yazdırır.
Kodunuz Discount.kt, PercentOff.kt, FixedOff.kt ve SpendMore.kt dosyalarına yazılmalıdır. Main.kt sağlanan giriş/çıkış 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 price = input[0].toInt()
for (line in input.drop(1)) {
val p = line.split(",")
val discount: Discount = when (p[0]) {
"p" -> PercentOff(p[1].toInt())
"f" -> FixedOff(p[1].toInt())
else -> SpendMore(p[1].toInt(), p[2].toInt())
}
println("$price -> ${discount.apply(price)}")
}
}
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