Açık Sınıflar ve Alt Sınıflar
Coddy'nin Kotlin Journey'sinin Nesne Yönelimli Programlama bölümünün bir parçası. Ders 17 / 57.
Kalıtım, bir sınıfın başka bir sınıfı temel almasını sağlar. Alt sınıf, üst sınıfının tüm özelliklerini ve metotlarını alır ve kendine ait olanları ekleyebilir. Kotlin sınıfları varsayılan olarak kapalıdır; bu nedenle başka bir sınıfın onu genişletebilmesi için sınıfın open olarak işaretlenmesi gerekir:
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name) {
fun fetch() = "$name fetches the ball"
}main içinde:
val rex = Dog("Rex")
println(rex.describe())
println(rex.fetch())Çıktı:
Rex is an animal
Rex fetches the ballclass Dog(name: String) : Animal(name), Dog sınıfının Animal sınıfını genişlettiğini ve name değerini üst sınıfın kurucusuna aktardığını belirtir. Özellik zaten Animal içinde bulunduğu için parametrede val yoktur. open olmayan bir sınıf genişletilemez:
class Plant(val name: String)
// class Tree(name: String) : Plant(name) // hata: bu tür final olduğu için genişletilemez
open class Vehicle(val wheels: Int)
class Bike : Vehicle(2) // sabit bir değer geçirir
class Truck(val load: Int) : Vehicle(6) // kendi özelliğini eklerBir Dog, bir Animal olduğundan, alt sınıf örneği üst sınıf türünün beklendiği her yerde kullanılabilir. Tek bir List<Animal> köpekleri, kedileri ve sıradan hayvanları tutabilir ve her öğe Animal üyelerine sahiptir:
open class Animal(val name: String) {
fun describe() = "$name is an animal"
}
class Dog(name: String) : Animal(name)
class Cat(name: String, val indoor: Boolean) : Animal(name)main içinde:
val pets: List<Animal> = listOf(Dog("Rex"), Cat("Tom", true), Animal("Generic"))
for (p in pets) println(p.describe())Çıktı:
Rex is an animal
Tom is an animal
Generic is an animalKalıtım, bir türüdür ilişkisini modeller: köpek bir hayvandır, tasarruf hesabı bir hesaptır. Bir sınıf yalnızca başka bir sınıfı kullanıyorsa (arabanın bir motoru vardır), bunun yerine o türden bir özellik verin. Kotlin'de sınıflar varsayılan olarak kapalıdır; bu nedenle genişletilmesi amaçlanan bir sınıf bunu open ile belirtir ve diğer tüm sınıflar davranışlarını alt sınıflara karşı güvenli tutar.
open class Account(val owner: String)
class SavingsAccount(owner: String) : Account(owner) // is-a: kalıtım
class Engine(val horsepower: Int)
class Car(val engine: Engine) // has-a: bir özellikGörev
KolayManager, Employee sınıfında zaten bulunan özellikleri tekrar ediyor. Employee sınıfını genişletilebilir yap ve Manager sınıfını onun alt sınıfına dönüştür: Manager(name: String, salary: Int), her iki değeri de Employee sınıfına aktarır ve yalnızca yeni olanı, addReport(name) ve teamSize() ile kullanılan, rapor edilen kişilerin adlarından oluşan özel bir listeyi tutar. Employee sınıfında raise(percent), maaşı belirtilen yüzde oranında aşağı yuvarlayarak artırır ve describe(), Ada earns 5500 değerini döndürür.
Sağlanan kod, ilk satırdan (name,salary) bir yönetici oluşturur, sonraki her adı rapor edilen kişi olarak ekler, %10 zam yapar ve Ada earns 5500 and leads 2 çıktısını verir; ardından bir yöneticinin Employee olduğunu denetler.
Kodunu Employee.kt ve Manager.kt dosyalarına yaz. Main.kt, sağlanan girdi/çıktı kodunu içerir ve düzenlenemez.
Kendin dene
fun main() {
// Sağlanan giriş/çıkış kodu: olduğu gibi bırakın
val input = generateSequence(::readLine).toList()
val (name, salary) = input[0].split(",")
val boss = Manager(name, salary.toInt())
for (report in input.drop(1)) boss.addReport(report)
boss.raise(10)
println("${boss.describe()} and leads ${boss.teamSize()}")
println("a manager is an employee: ${(boss as Any) is Employee}")
}
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