2016-03-10 6 views
11

OK, jetzt da Kotlin offiziell raus ist und ich wieder damit spiele, bin ich ziemlich verwirrt, dass ich zwischen den Vorteilen von sealed und data wählen muss, aber irgendwie kann beides nicht haben.Kotlin: versiegelte Klasse kann Datenklassen nicht "enthalten"? Warum?

Dies ist zum Beispiel, scheint mir sinnvoll zu machen, aber nicht kompiliert:

sealed class Expr { 
    data class Const(val number: Double) : Expr() 
    data class Sum(val expr1 : Expr, val expr2 : Expr) : Expr() 
} 

, weil die Datenklassen nicht anderen Klassen erweitern können.

Gibt es etwas, das mir fehlt?

+0

Seit Kotlin 1.1 ist dies jetzt möglich https://kotlinlang.org/docs/reference/whatsnew.11.html?q=da&p=0#sealed-and-data-classes. – Stim

Antwort

15

Kurz vor dem Eintritt in den Beta-Status hatte das Kotlin-Team aufgrund der Probleme, die sie in den Klassenhierarchien verursacht haben, beschlossen, bestimmte Einschränkungen für die Klassen data (see this post) hinzuzufügen.

Eine der Einschränkungen ist, dass die Klasse data keine andere Klasse unterteilen darf, nur Schnittstellen sind zulässig. Folglich können data Klassen nicht von einer abgeleitet werden.

Dies war eine notwendige Maßnahme, um eine weitere Verschiebung der Version 1.0 zu vermeiden. Einige der Einschränkungen sollten in zukünftigen Versionen aufgehoben werden, sobald die problematischen Fälle gründlich überprüft wurden und eine gute Designlösung gefunden wurde.

+1

Danke für den Link! – Lovis

+0

Also, vielleicht gibt es Hoffnung - danke für die Erklärung! –

+1

Wenn ich richtig lese, sieht es so aus, als ob diese Einschränkung mit 1.1 aufgehoben wird (siehe [diese Ausgabe] (https://github.com/Kotlin/KEEP/issues/31) und [dieses Designdokument] (https://github.com/Kotlin/KEEP/blob/master/proposals/data-class-inheritance.md)). – mkobit

Verwandte Themen