Menu
CoddyTech

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: 6

Member 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
}
challenge icon

Tantangan

Mudah

Animal 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())
}
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