Menu
Coddy logo textTech

Üyeleri Geçersiz Kılma

Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 18 / 57.

Bir alt sınıf, miras alınan bir metodu kendi sürümüyle değiştirebilir. Üst sınıf metodu open olarak işaretler ve alt sınıf metodu override ile yeniden bildirir:

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"
}

main içinde:

println(Dog("Rex").sound())
println(Cat("Tom").sound())
println(Animal("Generic").sound())

Çıktı:

Woof
Meow
...

Çalıştırılan sürüm, değişkenin türü üst sınıf olsa bile nesnenin gerçek sınıfına göre seçilir. Üst sınıf içindeki kod açık bir metodu çağırdığında alt sınıfın sürümünü de alır:

open class Animal(val name: String) {
    open fun sound() = "..."
    fun speak() = "$name says ${sound()}"
}
class Dog(name: String) : Animal(name) {
    override fun sound() = "Woof"
}

main içinde:

val pets: List<Animal> = listOf(Dog("Rex"), Animal("Generic"))
for (p in pets) println(p.speak())

Çıktı:

Rex says Woof
Generic says ...

Özellikler de aynı şekilde geçersiz kılınabilir: üst sınıfta open val, alt sınıfta override val; normal bir özellik, kurucu özelliği veya hesaplanan bir getter olarak:

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"
}

main içinde:

for (s in listOf(Shape(), Triangle(), Polygon(6))) println("${s.name}: ${s.corners}")

Çıktı:

shape: 0
triangle: 3
6-gon: 6

override ile işaretlenmiş bir üye yeniden açıktır; bu nedenle alt sınıfın alt sınıfı onu bir kez daha geçersiz kılabilir; final override bunu engeller. open içermeyen bir üye hiçbir şekilde geçersiz kılınamaz ve bir alt sınıf aynı imzaya sahip bir üye tanımlayamaz:

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"   // hata: 'Dog' içindeki 'sound' final
    // fun sleep() = "nap"            // hata: 'sleep' üst sınıfın bir üyesini gizliyor
}
challenge icon

Görev

Kolay

Animal, legs() (4), sound() (...) ve describe() yöntemlerine sahiptir; describe(), legs() ve sound() kullanılarak oluşturulan Rex has 4 legs and says Woof değerini döndürür. legs() ve sound() yöntemlerini geçersiz kılınabilir hâle getirin ve alt sınıfları yalnızca bu iki yöntemi geçersiz kılarak tamamlayın: Dog, Woof der; Bird 2 bacağa sahiptir ve Tweet der; Snake 0 bacağa sahiptir ve Hiss der. describe(), Animal içinde olduğu gibi kalır.

Sağlanan kod dog,Rex, bird,Pip, snake,Kaa veya başka herhangi bir tür (yalın bir Animal) içeren satırları okur, hayvanları tek bir List<Animal> içinde saklar ve her biri için describe() çıktısını yazdırır.

Kodunuz Animal.kt, Dog.kt, Bird.kt ve Snake.kt dosyalarına gider. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.

Kendin dene

fun main() {
    // Sağlanan girdi/çıktı kodu: olduğu gibi bırakın
    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 iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Nesne Yönelimli Programlama bölümündeki tüm dersler

Kendi başına pratik yap: Kotlin playground