📜  Kotlin Sealed类(1)

📅  最后修改于: 2023-12-03 15:32:30.147000             🧑  作者: Mango

Kotlin Sealed类

Kotlin的Sealed类是一种特殊的类,用于限制类的继承结构。它是在Kotlin 1.5版本中引入的,它允许在一个限定的继承结构中定义类。

Sealed类的定义

Sealed类与Enum类很像,可以看作是一种特殊的枚举类。它的定义方式如下:

sealed class 类名
Sealed类的子类

Sealed类的子类必须是在同一个文件中声明的嵌套类。这些子类可以有自己的子类,但是也必须在同一个文件中声明。

sealed class Expr {
    class Const(val number: Double) : Expr()
    class Sum(val e1: Expr, val e2: Expr) : Expr()
    object NotANumber : Expr()
}

在上面的代码中,我们定义了一个名为ExprSealed类,它有三个子类:Const, SumNotANumber

Sealed类的使用

Sealed类的主要用处是处理when表达式。使用Sealed类可以确保所有的情况都已处理,不需要使用else分支。

下面的代码演示了如何使用when表达式处理Sealed类:

fun eval(expr: Expr): Double = when (expr) {
    is Expr.Const -> expr.number
    is Expr.Sum -> eval(expr.e1) + eval(expr.e2)
    Expr.NotANumber -> Double.NaN
}

在上面的代码中,我们定义了一个eval函数,用于计算Expr的值。使用when表达式,我们访问了Expr的三个子类。如果表达式是Expr.Const类型,则返回其值;如果是Expr.Sum类型,则递归调用eval函数计算其值;如果是Expr.NotANumber类型,则返回Double.NaN

总结

Sealed类是一种特殊的类,用于限制类的继承结构。它的子类必须在同一个文件中声明,并且可以包含自己的子类。Sealed类主要用于处理when表达式,可以确保所有情况都已处理。