Ü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: 6override 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
}Görev
KolayAnimal, 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())
}
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
1Sınıflar ve Nesneler
Dosyalarla ÇalışmaSınıfları TanımlamaBirincil Yapıcılarinit Blokları ve Doğrulamaİkincil YapıcılarTekrar - Kütüphane Kartı4Kalıtım
Açık Sınıflar ve Alt SınıflarÜyeleri Geçersiz Kılmasuper ve YapıcılarSoyut SınıflarTekrar - Personel Dizini2Özellikler ve Kapsülleme
Özel ErişimcilerGörünürlük DeğiştiricileriÖzel Setter'larlazy ve lateinitTekrar - Banka Hesabı5Arayüzler
Arayüz BildirimleriVarsayılan MetotlarBirden Çok ArayüzTür Olarak ArayüzlerÖzet - Ödeme Yöntemleri8Generic'ler
Generic FonksiyonlarGeneric SınıflarTür Kısıtlamalarıin ve out ile VaryansTekrar - Öncelik Kuyruğu11Proje: Kütüphane Yönetimi
Kitaplar ve ÜyelerKitap Ödünç AlmaKendi başına pratik yap: Kotlin playground