Menu
Coddy logo textTech

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 ball

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

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

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

Görev

Kolay

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