ProgrammierungKotlin Entwickler

Was ist der Unterschied zwischen der Deklaration einer Klasse mit dem Schlüsselwort 'open' und einer normalen Klasse in Kotlin, und wie wird die Vererbung umgesetzt? Nennen Sie Feinheiten, Besonderheiten und ein Codebeispiel.

Bestehen Sie Vorstellungsgespräche mit dem Hintsage-KI-Assistenten

Antwort

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!") } }
  • Wenn 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.
  • Schnittstellen werden mit dem Schlüsselwort interface implementiert und benötigen open nicht.

Fangfrage

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

Beispiele realer Fehler aufgrund mangelnden Wissens über Feinheiten des Themas


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.