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 ballclass 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 hinzuEin 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 animalVererbung 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 EigenschaftAufgabe
EinfachManager 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}")
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Objektorientierte Programmierung
1Klassen und Objekte
Arbeiten mit DateienKlassen definierenPrimärkonstruktoreninit-Blöcke und ValidierungSekundärkonstruktorenRückblick – Bibliotheksausweis4Vererbung
Offene Klassen und UnterklassenÜberschreiben von Membernsuper und KonstruktorenAbstrakte KlassenRückblick – Mitarbeiterverzeichnis2Eigenschaften und Kapselung
Benutzerdefinierte ZugriffsmethodenSichtbarkeitsmodifikatorenPrivate Setterlazy und lateinitWiederholung – Bankkonto5Schnittstellen
Schnittstellen deklarierenStandardmethodenMehrere SchnittstellenSchnittstellen als TypenRückblick – Zahlungsmethoden8Generics
Generische FunktionenGenerische KlassenTypbeschränkungenVarianz mit in und outRückblick – Prioritätswarteschlange11Projekt: Bibliotheksverwaltung
Bücher und MitgliederBücher ausleihenÜbe selbstständig: Kotlin-Playground