Menu
Coddy logo textTech

İ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.0

Varsayı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: 7

Yapı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
}
challenge icon

Görev

Kolay

Duration(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())
}
quiz iconKendini test et

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

Kendi başına pratik yap: Kotlin playground