super ve Yapıcılar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 19 / 57.
super.method(), bir override içinden bir metodun üst sınıftaki sürümünü çağırır. Bir alt sınıf, miras alınan davranışı değiştirmek yerine genişletebilir:
open class Notification(val text: String) {
open fun render() = "[info] $text"
}
class Reminder(text: String, val minutes: Int) : Notification(text) {
override fun render() = super.render() + " (in $minutes min)"
}main içinde:
println(Notification("backup done").render())
println(Reminder("meeting", 10).render())Çıktı:
[info] backup done
[info] meeting (in 10 min)Her alt sınıf, bir üst sınıf oluşturucusunu çağırmalıdır. Birincil oluşturucuyla bu çağrı başlığın parçasıdır: : Base(arguments) ve bağımsız değişkenler alt sınıfın parametrelerinden hesaplanabilir:
open class Product(val name: String, val price: Int)
class Discounted(name: String, price: Int, val percent: Int) :
Product(name, price * (100 - percent) / 100)main içinde:
val tea = Discounted("tea", 500, 10)
println("${tea.name} ${tea.price} (${tea.percent}% off)")Çıktı:
tea 450 (10% off)Oluşturma hiyerarşinin en üstünden aşağıya doğru gerçekleşir: üst sınıfın özellik başlatıcıları ve init blokları önce çalışır, ardından alt sınıfınkiler çalışır:
open class Base(name: String) {
init { println("Base init for $name") }
}
class Child(name: String) : Base(name.uppercase()) {
init { println("Child init for $name") }
}main içinde:
Child("kit")Çıktı:
Base init for KIT
Child init for kitBir birincil kurucusu olmayan sınıf, her ikincil kurucudan super(...) ile üst sınıfı çağırır veya kendi kurucularından birine this(...) ile devreder:
open class Shape(val name: String)
class Rect : Shape {
val w: Int
val h: Int
constructor(w: Int, h: Int) : super("rect") {
this.w = w
this.h = h
}
constructor(side: Int) : this(side, side)
}main içinde:
val r = Rect(3)
println("${r.name} ${r.w}x${r.h}")Çıktı:
rect 3x3Üst sınıf önce kurulduğu için, oluşturucusundan veya init bloğundan open üyeleri çağırmamalıdır. Geçersiz kılma, alt sınıfın kendi özellikleri değerlerini almadan önce çalışır:
open class Base {
init { println("Base sees: ${describe()}") }
open fun describe() = "base"
}
class Child : Base() {
val label = "child"
override fun describe() = "label is $label"
}main içinde:
Child()Çıktı:
Base sees: label is nullGörev
KolayNotification(text), [info] text döndüren bir open metot olan render()'a sahiptir. Alt sınıfları tamamlayın: Warning'in render() metodu, metin büyük harflerle yazılmış şekilde [warn] TEXT döndürür; ayrıca minutes değerini saklayan Reminder ise super kullanarak üst sınıf sonucunun ardından (in 10 min) döndürür.
Sağlanan kod info,text, warn,text veya remind,text,10 satırlarını okur, eşleşen nesneyi tek bir List<Notification> içinde oluşturur ve her biri için render() çıktısını yazdırır.
Kodunuz Notification.kt, Warning.kt ve Reminder.kt dosyalarına gitmelidir. 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 notes = mutableListOf<Notification>()
for (line in input) {
val p = line.split(",")
notes.add(when (p[0]) {
"warn" -> Warning(p[1])
"remind" -> Reminder(p[1], p[2].toInt())
else -> Notification(p[1])
})
}
for (n in notes) println(n.render())
}
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