2015-02-24 13 views
23

Kotlin có bất kỳ thứ gì giống như các công đoàn phân biệt (loại tiền) không? Điều gì sẽ là Kotlin dịch thành ngữ này (F #):Kotlin và các tổ chức phân biệt đối xử (các loại tiền)

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 

Trả lời

20

Cách phổ biến thực hiện loại trừu tượng trong một OO-ngôn ngữ (ví dụ Kotlin hoặc Scala) sẽ được thông qua thừa kế:

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() 
} 

bạn có thể đẩy một phần chung cho các lớp cha, nếu bạn thích:

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) 
} 

Trình kiểm tra loại không biết rằng một hệ thống như vậy được đóng lại, vì vậy khi bạn làm một trận đấu trường như (when -expression) trên đó, nó sẽ phàn nàn rằng nó không phải là đầy đủ, nhưng điều này sẽ được sửa chữa sớm.

Cập nhật: khi Kotlin không hỗ trợ mô hình phù hợp với, bạn có thể sử dụng khi -expressions như dàn diễn viên thông minh để có được hầu hết các hành vi tương tự:

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

Xem thêm về thông minh phôi here.

+0

Hi, nhờ trả lời của bạn! Trong Scala, tôi sẽ sử dụng 'niêm phong Trait OrderMessage' và' case class New (..) mở rộng OrderMessage' vv. Sau đó tôi có thể khớp mẫu trên các loại tin nhắn thứ tự và truy cập vào các trường của chúng cùng loại (giống như trong F # ví dụ ở trên). Bất kỳ cơ hội nào chúng tôi có thể làm điều đó với 'khi nào' ở Kotlin bất cứ lúc nào? :) – ehnmark

+0

@enhmark Những gì bạn có thể làm là: http://kotlin-demo.jetbrains.com/?publicLink=104074971561017308771-1714234109. Xem thêm về phôi thông minh: http://kotlinlang.org/docs/reference/typecasts.html#smart-casts –

+0

@AndreyBreslav "sẽ khiếu nại về mức độ mệt mỏi". Bạn đã quên đặt một "không" ở đó? Nếu không, tôi không hiểu rằng một phần câu trả lời của bạn. – HRJ

13

Phương pháp tiếp cận sealed class của Kotlin là rất giống với Scala sealed class.

https://kotlinlang.org/docs/reference/sealed-classes.html

Ví dụ (từ liên kết đó):

sealed class Expr { 
    class Const(val number: Double) : Expr() 
    class Sum(val e1: Expr, val e2: Expr) : Expr() 
    object NotANumber : Expr() 
} 
Các vấn đề liên quan