Menimpa Anggota
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Kotlin di Coddy. Pelajaran 18 dari 57.
Subclass dapat mengganti method yang diwarisi dengan versinya sendiri. Superclass menandai method dengan open, dan subclass mendeklarasikannya kembali dengan override:
open class Animal(val name: String) {
open fun sound() = "..."
}
class Dog(name: String) : Animal(name) {
override fun sound() = "Woof"
}
class Cat(name: String) : Animal(name) {
override fun sound() = "Meow"
}Di dalam main:
println(Dog("Rex").sound())
println(Cat("Tom").sound())
println(Animal("Generic").sound())Output:
Woof
Meow
...Versi yang dijalankan ditentukan oleh class aktual milik object, meskipun tipe variabelnya adalah superclass. Kode di dalam superclass yang memanggil method open juga mendapatkan versi subclass:
open class Animal(val name: String) {
open fun sound() = "..."
fun speak() = "$name says ${sound()}"
}
class Dog(name: String) : Animal(name) {
override fun sound() = "Woof"
}Di dalam main:
val pets: List<Animal> = listOf(Dog("Rex"), Animal("Generic"))
for (p in pets) println(p.speak())Output:
Rex says Woof
Generic says ...Property dapat di-override dengan cara yang sama: open val di superclass, override val di subclass, baik sebagai property biasa, property konstruktor, maupun getter terhitung:
open class Shape {
open val name = "shape"
open val corners = 0
}
class Triangle : Shape() {
override val name = "triangle"
override val corners = 3
}
class Polygon(override val corners: Int) : Shape() {
override val name: String
get() = "$corners-gon"
}Di dalam main:
for (s in listOf(Shape(), Triangle(), Polygon(6))) println("${s.name}: ${s.corners}")Output:
shape: 0
triangle: 3
6-gon: 6Member yang ditandai dengan override terbuka kembali, sehingga subclass dari subclass dapat meng-override-nya sekali lagi; final override mencegahnya. Member tanpa open sama sekali tidak dapat di-override, dan subclass tidak boleh mendeklarasikan member dengan signature yang sama:
open class Animal {
open fun sound() = "..."
fun sleep() = "zzz"
}
open class Dog : Animal() {
final override fun sound() = "Woof"
}
class Puppy : Dog() {
// override fun sound() = "Yip" // error: 'sound' di 'Dog' bersifat final
// fun sleep() = "nap" // error: 'sleep' menyembunyikan anggota superclass
}Tantangan
MudahAnimal memiliki legs() (4), sound() (...), dan describe(), yang mengembalikan Rex has 4 legs and says Woof yang dibuat dari legs() dan sound(). Buat legs() dan sound() dapat ditimpa, lalu lengkapi subclass dengan hanya menimpa kedua method tersebut: Dog mengeluarkan suara Woof, Bird memiliki 2 kaki dan mengeluarkan suara Tweet, dan Snake memiliki 0 kaki dan mengeluarkan suara Hiss. describe() tetap seperti semula di Animal.
Code yang disediakan membaca baris dog,Rex, bird,Pip, snake,Kaa atau jenis lainnya (sebuah Animal biasa), menyimpan hewan-hewan dalam satu List<Animal>, lalu mencetak describe() untuk masing-masing.
Kodemu ditulis di Animal.kt, Dog.kt, Bird.kt, dan Snake.kt. Main.kt berisi code input/output yang disediakan dan tidak boleh diedit.
Coba sendiri
fun main() {
// Kode input/output yang disediakan: biarkan tetap seperti itu
val input = generateSequence(::readLine).toList()
val animals = mutableListOf<Animal>()
for (line in input) {
val (kind, name) = line.split(",")
animals.add(when (kind) {
"dog" -> Dog(name)
"bird" -> Bird(name)
"snake" -> Snake(name)
else -> Animal(name)
})
}
for (a in animals) println(a.describe())
}
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 Perpustakaan4Pewarisan
Kelas Terbuka dan SubkelasMenimpa Anggotasuper dan KonstruktorKelas AbstrakUlasan: Direktori Staf2property 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