Ответ 1
Общим способом реализации такого вида абстракции в OO-языке (например, 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
-expression), оно будет жаловаться, что оно не является исчерпывающим, но это будет исправлено в ближайшее время.
Обновление:, в то время как Kotlin не поддерживает сопоставление шаблонов, вы можете использовать при -выражения как умные приведения, чтобы получить почти то же поведение:
when (message) {
is New -> println("new $id: $quantity")
is Cancel -> println("cancel $id")
}
Подробнее о умных приведениях здесь.