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.
Nguồn
2015-02-25 12:29:57
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
@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 –
@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