Menu
CoddyTech

Fungsi Ekstensi

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

Fungsi ekstensi menambahkan fungsi ke tipe yang sudah ada tanpa mengubah kode sumber tipe tersebut. Namanya ditulis setelah tipe penerima, dan di dalamnya this merujuk ke penerima, yang juga bisa dihilangkan:

fun String.shout() = uppercase() + "!"
fun Int.isEven() = this % 2 == 0

Di dalam main:

println("hello".shout())
println(7.isEven())
println(listOf(1, 2, 3, 4).count { it.isEven() })

Output:

HELLO!
false
2

Extension juga berfungsi pada class buatanmu sendiri, dan property extension menambahkan property hasil komputasi. Extension tidak dapat menambahkan state tersimpan, dan hanya dapat mengakses member publik dari receiver-nya:

class Temperature(val celsius: Double)

val Temperature.fahrenheit: Double
    get() = celsius * 9 / 5 + 32

fun Temperature.describe() = "$celsius C is $fahrenheit F"

Di dalam main:

println(Temperature(100.0).describe())

Output:

100.0 C is 212.0 F

Ekstensi diselesaikan secara statis: tipe yang dideklarasikan untuk ekspresi menentukan ekstensi saat program dikompilasi, bukan class object. Inilah perbedaan utama dari member yang dioverride:

open class Shape {
    open fun member() = "shape member"
}
class Circle : Shape() {
    override fun member() = "circle member"
}

fun Shape.ext() = "shape extension"
fun Circle.ext() = "circle extension"

Di dalam main:

val s: Shape = Circle()
println(s.member())
println(s.ext())

Output:

circle member
shape extension

Jika class sudah memiliki member dengan signature yang sama, member selalu menang. Gunakan member untuk perilaku yang merupakan bagian dari tipe dan dapat ditimpa; gunakan extension untuk helper yang ditambahkan dari luar, seperti pemformatan untuk class yang bukan milikmu:

class Robot {
    fun greet() = "member greet"
}

fun Robot.greet() = "extension greet"
fun Robot.wave() = "extension wave"

Di dalam main:

val r = Robot()
println(r.greet())
println(r.wave())

Output:

member greet
extension wave
challenge icon

Tantangan

Mudah

Money(cents) disediakan di Money.kt. Buat extension untuknya di MoneyExtensions.kt: extension property Int.dollars dan Int.cents, yang mengubah angka menjadi Money (12.dollars adalah 1200 sen), Money.format(), yang mengembalikan $12.50 (atau -$3.05 untuk jumlah negatif), List<Money>.total(), yang mengembalikan jumlahnya sebagai Money, dan Money.split(parts), yang membaginya menjadi parts jumlah yang selisihnya paling banyak satu sen, dengan jumlah yang lebih besar di awal.

Kode yang disediakan membaca baris 12 dollars atau 50 cents dan baris terakhir yang berisi jumlah bagian. Kode ini mencetak setiap jumlah, total: $12.50 dan split 3: $4.17 $4.17 $4.16.

Tulis kodemu di MoneyExtensions.kt dan Money.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 amounts = input.dropLast(1).map { line ->
        val (n, unit) = line.split(" ")
        if (unit == "dollars") n.toInt().dollars else n.toInt().cents
    }
    for (m in amounts) println(m.format())
    val total = amounts.total()
    println("total: ${total.format()}")
    val parts = input.last().toInt()
    println("split $parts: " + total.split(parts).joinToString(" ") { it.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