Обычным способом реализации такого рода абстракции на объектно-ориентированном языке (например, Kotlin или Scala) было бы наследование:
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()
}
Вы можете передать общую часть в суперкласс, если хотите:
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)
}
Средство проверки типов не знает, что такая иерархия закрыта, поэтому, когда вы выполняете для нее сопоставление по регистру (when
-выражение), оно будет жаловаться, что оно не является исчерпывающим, но это скоро будет исправлено.
Обновление: хотя Kotlin не поддерживает сопоставление с образцом, вы можете использовать when -выражения в качестве умного приведения, чтобы получить почти такое же поведение:
when (message) {
is New -> println("new $id: $quantity")
is Cancel -> println("cancel $id")
}
Дополнительную информацию об умном приведении см. здесь.
person
Andrey Breslav
schedule
25.02.2015