2015-02-24 3 views
23

Hat Kotlin etwas wie diskriminierte Vereinigungen (Summenarten)? Was würde die idiomatische Kotlin Übersetzung dieses (F #) sein:Kotlin und diskriminierte Vereinigungen (Summenarten)

type OrderMessage = 
    | New of Id: int * Quantity: int 
    | Cancel of Id: int 

let handleMessage msg = 
    match msg with 
     | New(id, qty) -> handleNew id qty 
     | Cancel(id) -> handleCxl id 

Antwort

20

Der gemeinsame Weg in einer OO-Sprache, diese Art von Abstraktion der Umsetzung (zB Kotlin oder Scala) wäre Erbe durch:

open class OrderMessage private() { // private constructor to prevent creating more subclasses outside 
    class New(val id: Int, val quantity: Int) : OrderMessage() 
    class Cancel(val id: Int) : OrderMessage() 
} 

Sie können den gemeinsamen Teil auf die übergeordnete schieben, wenn man so will:

open class OrderMessage private (val id: Int) { // private constructor to prevent creating more subclasses outside 
    class New(id: Int, val quantity: Int) : OrderMessage(id) 
    class Cancel(id: Int) : OrderMessage(id) 
} 

die Typprüfer wissen nicht, dass eine solche Hierarchie geschlossen ist, so dass, wenn Sie tun, um eine Fall-ähnlichen Spiel (when -ausdruck) darauf wird es sich beschweren, dass es nicht erschöpfend ist, aber das wird bald behoben sein.

Update: während Kotlin nicht Muster unterstützt passende, können Sie verwenden, wenn -expressions als intelligenten Abgüsse fast das gleiche Verhalten zu erhalten:

when (message) { 
    is New -> println("new $id: $quantity") 
    is Cancel -> println("cancel $id") 
} 

Sehen Sie mehr über Smart wirft here.

+0

Hallo, vielen Dank für Ihre Antwort! In Scala würde ich eine versiegelte Trait OrderMessage verwenden und die Fallklasse New (..) erweitert OrderMessage usw. Ich könnte dann Muster auf Auftragsnachrichtentypen abgleichen und Zugriff auf ihre Felder auf den gleichen Typ bekommen (genau wie in der F # Beispiel oben). Eine Chance, dass wir das bald mit 'wann' in Kotlin machen können? :) – ehnmark

+0

@enhmark Was Sie tun können, ist dies: http://kotlin-demo.jetbrains.com/?publicLink=104074971561017308771-1714234109. Sehen Sie mehr über intelligente Casts: http://kotlinlang.org/docs/reference/typecasts.html#smart-casts –

+0

@AndreyBreslav "wird sich über die Vollständigkeit beschweren". Hast du vergessen, ein "nicht" dort zu setzen? Ansonsten verstehe ich diesen Teil deiner Antwort nicht. – HRJ

Verwandte Themen