Standardmäßig sind alle Klassen, Methoden und Eigenschaften in Kotlin final. Das bedeutet, dass sie nicht vererbt oder überschrieben werden können, es sei denn, der Modifikator open wird ausdrücklich angegeben.
Das Schlüsselwort open erlaubt die Vererbung einer Klasse oder das Überschreiben einer Methode. Dies ist ein fundamentales Unterscheidungsmerkmal zu Java, wo Klassen standardmäßig für die Vererbung offen sind.
Beispiel:
open class Animal { open fun sayHello() { println("Hallo von Animal!") } } class Dog : Animal() { override fun sayHello() { println("Wuff!") } }
open aus der Klasse Animal entfernt wird, führt der Versuch der Vererbung zu einem Kompilierungsfehler.override ist zwingend erforderlich für Methoden/Eigenschaften, die Sie überschreiben möchten.interface implementiert und benötigen open nicht.Kann man in Kotlin jede Klasse ebenso vererben wie in Java?
Antwort: Nein, nur Klassen, die mit open (oder abstract) gekennzeichnet sind. Normale Klassen sind final und können nicht vererbt werden. Dies dient der Erhöhung der Sicherheit und Vorhersehbarkeit des Codes.
Beispiel für fehlerhaften Code:
class Animal class Dog : Animal() // Kompilierungsfehler: "Animal" ist final
Geschichte
In einem Projekt für die Android-Plattform versuchte ein junger Entwickler, eine Benutzerkomponente von einer benutzerdefinierten View-Klasse abzuleiten, ohne open hinzuzufügen. Der Build brach zusammen, der Grund war nicht offensichtlich, und die Fristen verschoben sich. Das Problem wurde erst nach sorgfältigem Lesen der Compiler-Nachricht entdeckt.
Geschichte
Bei der Entwicklung eines SDK verlangte die Spezifikation eine erweiterbare Basisklasse, aber sie wurde ohne open deklariert. Nach der Lieferung an die Kunden stellte sich heraus, dass die Bibliothek ohne Änderungen am Quellcode nicht erweitert werden konnte. Ein Update musste veröffentlicht werden.
Geschichte
In einem der Projekte wurde alter Java-Code nach Kotlin migriert, ohne die Standard-Closedness von Klassen zu berücksichtigen. Der Großteil der Unit-Tests, die Mocks verwendeten, konnte nicht mehr kompiliert werden, was den Release-Prozess verlangsamte. Erst nach der massenhaften Hinzufügung von open wurde das Problem gelöst.