Menu
CoddyTech

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 ball

class 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 ekler

Bir 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 animal

Kalı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 özellik
challenge icon

Görev

Kolay

Manager, 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}")
}
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