Kotlin: Erben
Willemers Informatik-Ecke
  • Klassen
  • Abstrakte Klassen und Interfaces

  • 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:
    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.