Menu
CoddyTech

Offene Klassen und Unterklassen

Teil des Abschnitts Objektorientierte Programmierung der Kotlin-Journey von Coddy. Lektion 17 von 57.

Vererbung ermöglicht es einer Klasse, auf einer anderen aufzubauen. Die Unterklasse erhält alle Eigenschaften und Methoden ihrer Oberklasse und kann eigene hinzufügen. Kotlin-Klassen sind standardmäßig geschlossen, daher muss eine Klasse mit open markiert werden, bevor eine andere Klasse sie erweitern kann:

open class Animal(val name: String) {
    fun describe() = "$name is an animal"
}

class Dog(name: String) : Animal(name) {
    fun fetch() = "$name fetches the ball"
}

Innerhalb von main:

val rex = Dog("Rex")
println(rex.describe())
println(rex.fetch())

Ausgabe:

Rex is an animal
Rex fetches the ball

class Dog(name: String) : Animal(name) besagt, dass Dog Animal erweitert und name an den Konstruktor der Oberklasse weitergibt. Der Parameter hat kein val, weil die Eigenschaft bereits in Animal existiert. Eine Klasse, die nicht open ist, kann nicht erweitert werden:

class Plant(val name: String)
// class Tree(name: String) : Plant(name)   // Fehler: Dieser Typ ist final und kann daher nicht erweitert werden

open class Vehicle(val wheels: Int)
class Bike : Vehicle(2)                     // übergibt einen festen Wert
class Truck(val load: Int) : Vehicle(6)     // fügt eine eigene Eigenschaft hinzu

Ein Dog ist ein Animal, daher kann eine Instanz einer Unterklasse überall dort verwendet werden, wo der Typ der Oberklasse erwartet wird. Eine List<Animal> kann Hunde, Katzen und gewöhnliche Tiere enthalten, und jedes Element verfügt über die Eigenschaften von Animal:

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)

Innerhalb von main:

val pets: List<Animal> = listOf(Dog("Rex"), Cat("Tom", true), Animal("Generic"))
for (p in pets) println(p.describe())

Ausgabe:

Rex is an animal
Tom is an animal
Generic is an animal

Vererbung bildet eine ist-ein-Beziehung ab: Ein Hund ist ein Tier, ein Sparkonto ist ein Konto. Wenn eine Klasse eine andere nur verwendet (ein Auto hat einen Motor), gib ihr stattdessen eine Eigenschaft dieses Typs. Klassen sind in Kotlin standardmäßig geschlossen, daher kennzeichnest du eine Klasse, die erweitert werden soll, mit open, und jede andere Klasse bleibt vor Unterklassen geschützt.

open class Account(val owner: String)
class SavingsAccount(owner: String) : Account(owner)   // ist-ein: Vererbung

class Engine(val horsepower: Int)
class Car(val engine: Engine)                          // hat-ein: eine Eigenschaft
challenge icon

Aufgabe

Einfach

Manager wiederholt, was Employee bereits besitzt. Mache Employee offen und verwandle Manager in seine Unterklasse: Manager(name: String, salary: Int) übergibt beide Werte an Employee und behält nur das Neue bei: eine private Liste mit den Namen der Berichte sowie addReport(name) und teamSize(). In Employee erhöht raise(percent) das Gehalt um diesen Prozentsatz, abgerundet, und describe() gibt Ada earns 5500 zurück.

Der bereitgestellte Code erstellt anhand der ersten Zeile (name,salary) einen Manager, fügt jeden folgenden Namen als Bericht hinzu, gewährt eine Gehaltserhöhung von 10 % und gibt Ada earns 5500 and leads 2 aus. Anschließend prüft er, ob ein Manager ein Employee ist.

Dein Code gehört in Employee.kt und Manager.kt. Main.kt enthält den bereitgestellten Ein-/Ausgabecode und kann nicht bearbeitet werden.

Probier es selbst

fun main() {
    // Vorgegebener Ein-/Ausgabecode: unverändert lassen
    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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Objektorientierte Programmierung

Übe selbstständig: Kotlin-Playground