Menu
CoddyTech

method Default

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

Sebuah method antarmuka dapat memiliki isi. Implementasi default ini digunakan oleh setiap class yang tidak menimpanya:

interface Greeter {
    val name: String
    fun greet() = "Hello, I am $name"
}
class Robot(override val name: String) : Greeter
class Pirate(override val name: String) : Greeter {
    override fun greet() = "Ahoy! $name here"
}

Di dalam main:

println(Robot("R2").greet())
println(Pirate("Anne").greet())

Output:

Hello, I am R2
Ahoy! Anne here

Default method ditulis menggunakan anggota interface lainnya. Sebuah class menyediakan beberapa anggota yang berbeda dan menerima sisanya:

interface Priced {
    val cents: Int
    fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
    fun isAffordable(budget: Int) = cents <= budget
}
class Coffee : Priced {
    override val cents = 450
}

Di dalam main:

val c = Coffee()
println(c.formatted())
println(c.isAffordable(400))

Output:

$4.50
false

Property dapat memiliki getter bawaan, tetapi interface tidak memiliki backing field, jadi tidak dapat menyimpan nilai. Property dengan initializer tidak dapat dikompilasi; getter yang menghitung nilai dapat digunakan:

interface Box {
    val width: Int
    val height: Int
    val area: Int
        get() = width * height
    // val count = 0      // error: penginisialisasi property tidak diizinkan dalam interface
}
class Tile(override val width: Int, override val height: Int) : Box

Di dalam main:

println(Tile(3, 4).area)

Output:

12

Override tetap dapat menggunakan implementasi default. Di dalam class, super.method() memanggil versi interface:

interface Priced {
    val cents: Int
    fun formatted() = "$%d.%02d".format(cents / 100, cents % 100)
}
class Coffee : Priced {
    override val cents = 450
    override fun formatted() = "coffee " + super.formatted()
}

Di dalam main:

println(Coffee().formatted())

Output:

coffee $4.50
challenge icon

Tantangan

Mudah

Interface Priced memiliki price (dalam sen). Berikan fungsi default formatted() yang mengembalikan $4.50 dan fungsi default isAffordable(budget) yang mengembalikan apakah harga tidak melebihi anggaran. Harga Coffee adalah 450 dan mengganti formatted() dengan coffee $4.50, dengan menggunakan kembali fungsi default melalui super. Sandwich(price) menggunakan kedua fungsi default.

Kode yang disediakan membaca anggaran dalam sen, lalu baris coffee atau sandwich,650. Kode mencetak formatted() dan yes atau no untuk setiap item.

Tulis kodemu di Priced.kt, Coffee.kt, dan Sandwich.kt. Main.kt berisi kode input/output yang disediakan dan tidak boleh diedit.

Coba sendiri

fun main() {
    // Kode input/output yang disediakan: biarkan apa adanya
    val input = generateSequence(::readLine).toList()
    val budget = input[0].toInt()
    for (line in input.drop(1)) {
        val p = line.split(",")
        val item: Priced = if (p[0] == "coffee") Coffee() else Sandwich(p[1].toInt())
        println("${item.formatted()} ${if (item.isAffordable(budget)) "yes" else "no"}")
    }
}
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