Das Schlüsselwort override in Kotlin dient dazu, die Überschreibung von Methoden und Eigenschaften der Superklasse oder eines Interfaces explizit zu kennzeichnen.
In Java kann man Methoden der Superklasse ohne das Schlüsselwort überschreiben, was manchmal zu Fehlern oder Tippfehlern führen kann. In Kotlin ist es notwendig, override für alle Überschreibungen anzugeben und open für das Mitglied der Superklasse.
Das Risiko der versehentlichen Überschreibung von Methoden der Basisklasse (accidental overriding) und die Notwendigkeit einer expliziten Verwaltung der vererbten Mitglieder. Darüber hinaus müssen die überschriebenen Methoden als open gekennzeichnet sein, andernfalls kann eine Überschreibung ohne Kompilierungsfehler nicht erfolgen.
Die Verwendung des Schlüsselworts override mit Methoden und Eigenschaften der Superklasse oder des Interfaces, die zuvor als open, abstract oder bereits override gekennzeichnet sind.
Beispielcode:
open class Animal { open fun sound() = "???" } class Dog : Animal() { override fun sound() = "Woof!" }
Kernmerkmale:
override kann die Methode nicht überschrieben werden — es wird ein Kompilierungsfehler auftreten;final, überschreiben kann man nur das, was explizit als open gekennzeichnet ist;override unterstützt Mehrfachvererbung durch Interfaces und Klassen.Kann man eine Eigenschaft oder Methode überschreiben, wenn sie nicht als open/abstract/override gekennzeichnet ist?
Nein, nur Mitglieder, die ausdrücklich als open/abstract/override gekennzeichnet sind, können in einer Unterklasse überschrieben werden.
Ist override beim Implementieren einer Methode eines Interfaces erforderlich?
Ja, immer, selbst wenn es sich um die erste Ebene der Implementierung handelt, ist override zwingend — das ist die Syntax von Kotlin für Einheitlichkeit.
Kann eine mit override gekennzeichnete Methode weiter überschrieben werden?
Ja, wenn die Methode nicht zusätzlich als final gekennzeichnet ist (standardmäßig erbt override open), kann sie auch weiter in der Hierarchie überschrieben werden.
open beim Grundmethoden nicht setzen — kann nicht überschrieben werden, der Compiler gibt einen Fehler aus;final-Methode zu überschreiben — nicht möglich, Kompilierungsfehler.Ein Entwickler vergisst das open bei der Basisklasse zu setzen:
class Cat { fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" // Kompilierungsfehler }
Vorteile:
Nachteile:
override-Fehler auf.Korrekte Definition der Klasse und der Absicht der Vererbung:
open class Cat { open fun meow() = "meow" } class Tiger: Cat() { override fun meow() = "ROAR" }
Vorteile:
Nachteile: