Menu
CoddyTech

Konstruktor sekunder

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 5 dari 57.

Sebuah class dapat menyediakan cara tambahan untuk dibuat dengan konstruktor sekunder, yang dideklarasikan dengan constructor. Setiap konstruktor harus memanggil konstruktor utama dengan this(...):

class Temperature(val celsius: Double) {
    constructor(fahrenheit: Int) : this((fahrenheit - 32) * 5 / 9.0)
}

Di dalam main:

println(Temperature(20.0).celsius)
println(Temperature(212).celsius)

Output:

20.0
100.0

Argumen default sering membuat constructor sekunder tidak diperlukan. Utamakan satu constructor utama dengan nilai default, dan gunakan constructor sekunder saat input memiliki bentuk yang berbeda, seperti teks yang perlu di-parse:

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)"
}

Di dalam main:

println(Color(128).label())
println(Color("FF8000").label())

Output:

rgb(128, 128, 128)
rgb(255, 128, 0)

Konstruktor utama dan blok init-nya dijalankan terlebih dahulu, lalu isi konstruktor sekunder:

class Log(val name: String) {
    init { println("primary: $name") }
    constructor(id: Int) : this("log-$id") {
        println("secondary: $id")
    }
}

Di dalam main:

Log(7)

Output:

primary: log-7
secondary: 7

Konstruktor harus dapat digunakan dengan setiap overload tanpa menimbulkan ambiguitas. Dua konstruktor dengan tipe parameter yang sama tidak diizinkan, dan pemanggilan yang dapat cocok dengan beberapa konstruktor tidak bisa compile.

class Size(val w: Int, val h: Int) {
    constructor(side: Int) : this(side, side)   // Size(3) -> persegi
    // constructor(w: Int) : this(w, 1)        // error: tanda tangan sama seperti di atas
}
challenge icon

Tantangan

Mudah

Lengkapi class Duration(val seconds: Int) dengan constructor sekunder (minutes: Int, seconds: Int) dan satu lagi yang menerima teks seperti 1:30 atau 2:05:10 (jam:menit:detik). Tambahkan format(), yang mengembalikan h:mm:ss dengan menit dan detik yang terdiri dari dua digit.

Kode yang disediakan membaca durasi sebagai teks dengan satu atau dua titik dua, membuat setiap durasi menggunakan constructor teks, lalu mencetak format(), kemudian mencetak total dan jumlah yang sudah diformat.

Tulis kodemu di Duration.kt. Main.kt berisi kode input/output yang disediakan dan tidak dapat diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan tetap seperti ini
    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 iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Playground Kotlin