|
|
Manche Klassen entsprechen anderen Klassen des Programms, sind aber in Details erweitert oder verändert. So werden in den meisten Programmen Personen mit Name und Adresse verwaltet, aber dann auch spezielle Personen wie Angestellte, für die zusätzliich das Gehalt oder deren Krankenkasse gespeichert werden. Für Kunden verwaltet man neben Name und Adresse die offenen Rechnungen, aber nicht die Krankenkasse.
Die Vererbung in der objektorientierten Programmierung sorgt dafür, dass möglichst keine doppelten Strukturen gespeichert und implementiert werden. So wird ein Kunde als erweiterte Person modelliert, die alle Eigenschaften der Klasse Person erbt und dieser überlässt. Stattdessen werden nur die Unterschiede zur Person implementiert, hier also die offenen Rechnungen.
Die Klasse Mitarbeiter erbt beispielsweise auch von Person, erhält aber als Bonus Krankenkasse und Gehalt. Hier lässt sich das Spiel weiterspielen, dass man Außendienstmitarbeiter als Mitarbeiter definiert, die zusätzlich zu Name und Krankenkasse auch noch einen Bezirk besitzen.
Erben mit Kotlin
Bei Kotlin muss die Möglichkeit zur Vererbung vom Programmierer der Basisklasse mit dem Schlüsselwort open bereits vorgesehen werden. Die weiteren Schritte der Vererbung:- Eine Klasse, von der geerbt werden soll, muss als open deklariert sein.
- Die erbende Klasse führt hinter einem Doppelpunkt den Namen der Basisklasse auf und füllt auch deren Konstruktorparameter.
- Alle Elemente der Basisklassen sind über Objekte der erbenden Klasse zugreifbar.
open class Person(_name:String) { var name = _name var alter = 20 } class Mitarbeiter(_name:String) : Person(_name) { var gehalt = 0 } fun main() { var boss = Mitarbeiter("Big Boss") println(boss.alter) }
Sichtbarkeit der Klassenelemente
Wenn der Programmierer nichts zu dem Thema sagt, ist ein Attribut oder eine Methode öffentlich. Er kann das mit dem Schlüsselwort public besonders unterstützen.Sollen bestimmte Elemente von außen nicht zugreifbar sein, kann man sie als private deklarieren. Es zeugt von gutem Design, wenn man Attribute grundsätzlich privat hält.
In manchen Fällen soll ein Element ausschließlich den erbenden Klassen zur Verfügung stehen. In solchen Fällen deklariert die Basisklasse das Element als protected. Im folgenden Beispiel ist das Alter der Person nur für die erbenden Klassen nutzbar.
open class Person(_name:String) { var name = _name protected var alter = 20 } class Mitarbeiter(_name:String) : Person(_name) { var gehalt = 0 var zugehoerig = alter-10 } fun main() { var boss = Mitarbeiter("Big Boss") println(boss.zugehoerig) println(boss.alter) // führt zu Fehler }
Überschreiben von Methoden
Methoden werden wie Attribute vererbt. Aber manchmal möchte die erbende Klasse eine geerbte Methode doch ändern. Dazu muss die Basisklasse allerdings zunächst die entsprechende Methode als open deklarieren und die erbende Klasse muss durch den Modifizierer override dokumentieren, dass sie die Methode überschreibt.open class Person(_name:String) { var name = _name protected var alter = 20 open fun tudochwas() { println("Ich habe frei.") } } class Mitarbeiter(_name:String) : Person(_name) { var gehalt = 0 var zugehoerig = alter-10 override fun tudochwas() { println("Ich schufte.") } } fun main() { var boss = Mitarbeiter("Big Boss") println(boss.zugehoerig) boss.tudochwas() }Das Programm wird als Ergebnis ausgeben, dass der arme Boss schuftet.