kotlin - 声明一个继承并初始化的对象

标签 kotlin

我看过这个Kotlin代码:

sealed class BookingState {
    object ReasonOfTravel : BookingState()
}

在Kotlin文档中,我看到了声明对象的示例:

https://kotlinlang.org/docs/reference/object-declarations.html

但是我看不到没有花括号的声明。在上面的代码示例中,ReasonOfTravel继承自BookingState,但之后没有大括号。仅在您要通过BookingState()初始化对象时运行一些代码时才需要花括号吗?

最佳答案

就您而言,object仅用作标记,没有任何特定行为。稍后,您可以检查BookingState实例并执行以下操作:

sealed class BookingState {
    object ReasonOfTravel : BookingState()
    object ReasonOfTravel2 : BookingState()
    object ReasonOfTravel3 : BookingState()
}

fun test(bookingState: BookingState) = when(bookingState) {
    BookingState.ReasonOfTravel -> println("1")
    BookingState.ReasonOfTravel2 -> println("2")
    BookingState.ReasonOfTravel3 -> println("3")
}

您可以随时使用花括号添加特定行为:
sealed class BookingState {
    object ReasonOfTravel : BookingState() {
        fun printMe() = println("test")
    }

    object ReasonOfTravel2 : BookingState()
    object ReasonOfTravel3 : BookingState()
}

fun test(bookingState: BookingState) = when (bookingState) {
    is BookingState.ReasonOfTravel -> bookingState.printMe()
    BookingState.ReasonOfTravel2 -> println("2")
    BookingState.ReasonOfTravel3 -> println("3")
}

花括号中的代码无法在对象初始化时运行。您必须使用init

关于kotlin - 声明一个继承并初始化的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57790760/

相关文章:

kotlin - 如何使用 Kotlin 在 Jackson 中使用默认值和必需值控制 null 反序列化?

kotlin - Kotlin 中的泛型和内联函数

android - Gradle Kotlin DSL 中 Dynatrace 的配置

swift - Kotlin 相当于 %@ 在 swift

kotlin - for范围中的 `val`不是不可变的?

kotlin - Kotlin中调用父类(super class)构造函数,Super不是表达式

java - Thrift 类型作为通用类型

java - 为什么某些 Java 函数能够更改不可变的 Kotlin 对象?

kotlin - 在 Kotlin 中扩展具有不同签名的 2 个 lambda

Kotlin 警告 : accessing non-final property in constructor