İkincil Yapıcılar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 5 / 57.
Bir sınıf, ikincil kurucular ile oluşturulmak için ek yollar sunabilir; bunlar constructor ile bildirilir. Her biri, this(...) ile birincil kurucuyu çağırmalıdır:
class Temperature(val celsius: Double) {
constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}main içinde:
println(Temperature(20.0).celsius)
println(Temperature(212).celsius)Çıktı:
20.0
100.0Varsayılan bağımsız değişkenler çoğu zaman ikincil oluşturucuları gereksiz kılar. Varsayılan değerleri olan tek bir birincil oluşturucuyu tercih edin ve metin ayrıştırma gibi girdinin farklı bir biçime sahip olduğu durumlarda ikincil bir oluşturucu kullanın:
class Color(val r: Int, val g: Int, val b: Int) {
constructor(gray: Int) : this(gray, gray, gray)
constructor(hex: String) : this(hex.substring(0, 2).toInt(16), hex.substring(2, 4).toInt(16), hex.substring(4, 6).toInt(16))
fun label() = "rgb($r, $g, $b)"
}main içinde:
println(Color(128).label())
println(Color("FF8000").label())Çıktı:
rgb(128, 128, 128)
rgb(255, 128, 0)Birincil kurucu ve init blokları önce çalışır, ardından ikincil kurucunun gövdesi çalışır:
class Log(val name: String) {
init { println("primary: $name") }
constructor(id: Int) : this("log-$id") {
println("secondary: $id")
}
}main içinde:
Log(7)Çıktı:
primary: log-7
secondary: 7Yapıcılar, her aşırı yüklemeyle belirsizliğe yer vermeden çalışmalıdır. Aynı parametre türlerine sahip iki yapıcıya izin verilmez ve birden fazla yapıcıyla eşleşebilecek bir çağrı derlenmez.
class Size(val w: Int, val h: Int) {
constructor(side: Int) : this(side, side) // Size(3) -> bir kare
// constructor(w: Int) : this(w, 1) // hata: yukarıdakiyle aynı imza
}Görev
KolayDuration(val seconds: Int) sınıfını, (minutes: Int, seconds: Int) şeklinde bir ikincil yapıcı ve 1:30 veya 2:05:10 (saat:dakika:saniye) gibi metinleri alan başka bir yapıcı ile tamamla. İki basamaklı dakika ve saniyelerle h:mm:ss döndüren format() işlevini ekle.
Sağlanan kod, süreleri bir veya iki iki nokta içeren metinler olarak okur, her birini metin yapıcısıyla oluşturur ve format() çıktısını yazdırır; ardından total ve biçimlendirilmiş toplamı yazdırır.
Kodun Duration.kt dosyasına yazılmalıdır. 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()
var total = 0
for (line in input) {
val d = Duration(line)
println(d.format())
total += d.seconds
}
println("total " + Duration(total).format())
}
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