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.0Argumen 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: 7Konstruktor 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
}Tantangan
MudahLengkapi 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())
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1class dan object
Bekerja dengan fileMendefinisikan classKonstruktor utamaBlok init dan validasiKonstruktor sekunderRingkasan: Kartu Perpustakaan2property dan Enkapsulasi
Accessor KustomModifier VisibilitasSetter Privatlazy dan lateinitRingkasan: Rekening Bank5Interface
Mendeklarasikan Interfacemethod DefaultBeberapa InterfaceInterface sebagai TipeUlasan: Metode Pembayaran11Proyek: Pengelolaan Perpustakaan
Buku dan AnggotaPeminjaman BukuLatihan sendiri: Playground Kotlin