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 üzerine kurulmasını sağlar. Alt sınıf, üst sınıfının her özelliğini ve metodunu alır ve kendine ait özellikler 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'un Animal'ı genişlettiğini ve name'i üst sınıf oluşturucusuna aktardığını belirtir. Parametrede val yoktur, çünkü özellik zaten Animal içinde bulunur. open olmayan bir sınıf genişletilemez:
class Plant(val name: String)
// class Tree(name: String) : Plant(name) // hata: bu tür final'dir, bu yüzden 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’dır; bu nedenle bir alt sınıf örneği, üst sınıf türünün beklendiği her yerde kullanılabilir. Bir List<Animal>, köpekleri, kedileri ve sıradan hayvanları barındırabilir 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 is-a ilişkisini modeller: bir köpek bir hayvandır, bir tasarruf hesabı bir hesaptır. Bir sınıf yalnızca başka bir sınıfı kullanıyorsa (bir arabanın motoru vardır), bunun yerine ona o türde bir özellik verin. Kapalı sınıflar Kotlin'de varsayılandı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ıflardan korur.
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'ın zaten sahip olduğu şeyleri tekrar ediyor. Employee'ı open yapın ve Manager'ı onun alt sınıfına dönüştürün: Manager(name: String, salary: Int) her iki değeri de Employee'a aktarır ve yalnızca yeni olanları, addReport(name) ve teamSize() içeren özel bir rapor adları listesi olarak saklar. Employee içinde raise(percent), maaşı bu yüzde kadar artırır ve sonucu aşağı yuvarlar; describe() ise Ada earns 5500 döndürür.
Sağlanan kod, ilk satırdan (name,salary) bir yönetici oluşturur, sonraki her adı bir rapor olarak ekler, %10 zam yapar ve Ada earns 5500 and leads 2 yazdırır; ardından bir yöneticinin Employee olduğunu kontrol eder.
Kodunuz Employee.kt ve Manager.kt dosyalarına gitmelidir. 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 (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