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 == 0Di dalam main:
println("hello".shout())
println(7.isEven())
println(listOf(1, 2, 3, 4).count { it.isEven() })Output:
HELLO!
false
2Extension 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 FEkstensi 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 extensionJika 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 waveTantangan
MudahMoney(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() })
}
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 Buku3Objek dan Companion Object
Deklarasi ObjectCompanion ObjectKonstanta dengan constEkspresi ObjectUlasan: Loket Tiket6Polimorfisme
Pemanggilan DinamisPemeriksaan Tipe dan Smart Castwhen dengan TipeFungsi EkstensiUlasan: Penjaga Kebun BinatangLatihan sendiri: Playground Kotlin