美文网首页
Kotlin面向对象之封闭类(Sealed Classes)

Kotlin面向对象之封闭类(Sealed Classes)

作者: 已迁至知乎_此不再维护 | 来源:发表于2017-05-26 09:28 被阅读0次

封闭类用于反应被限制了的类层次结构:一个值的类型只能是有限集合中的一种,而不能是集合外的其他类型。它们在某种意义上是枚举类的扩展:枚举类型的值的集合也被限制,每个枚举常量仅作为单个实例存在;然而封闭类的子类可以有多个实例,且这些实例仍然可以持有状态。

要想声明一个封闭类,需要在类名前添加sealed修饰符。一个封闭类可以有子类,但是这些子类必须在和封闭类同一个文件中声明。(在Kotlin1.1之前,规则更苛刻:子类必须嵌套在封闭类的内部)。

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

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

(上面这段代码使用了Kotlin1.1的一个新特性:数据类可以继承其他类,也包括封闭类。)

注意:继承(直接继承)封闭类的子类的类,可以放置在其他任意地方,不必非要放在同一个文件中。

使用密封类的关键好处是在使用when表达式时使用它们。如果可以保证该语句涵盖了所有情况,则不需要在语句中添加一个else子句。

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
    // the `else` clause is not required because we've covered all the cases
}

相关文章

  • Kotlin面向对象之封闭类(Sealed Classes)

    封闭类用于反应被限制了的类层次结构:一个值的类型只能是有限集合中的一种,而不能是集合外的其他类型。它们在某种意义上...

  • Kotlin —  Sealed Classes(密封类)

    我先翻译为密封类吧O__O "…。 什么是密封类? 官方文档:密封类用于表示受限类的层次结构,当一个值有一个有限的...

  • Kotlin面向对象之数据类(Data Classes)

    我们经常会创建一个除了持有数据,而没有其他用途的类。在这样一个类中,一些标准的函数(setter、getter等)...

  • Kotlin面向对象之嵌套类(Nested Classes)

    一个类可以嵌套在其他类的内部: 内部类(Inner classes) 类可以被标记为inner以能够访问外部类的成...

  • Kotlin面向对象之枚举类(Enum Classes)

    枚举类的最基本用法是实现类型安全的枚举 枚举常量是一个对象。枚举常量之间以逗号分隔。 初始化(Initializa...

  • Kotlin-Sealed Classes(密封类)

    (翻译) 什么是密封类? 来自文档:密封类用于表示受限制的类层次结构,当一个值可以有一个有限集合中的一个类型,但不...

  • kotlin-sealed classes

    sealed classes是一堆存在继承关系的类的集合。 类似于java中的枚举。不同的是,每个枚举类型只能存在...

  • Day31

    面向对象=对象+类+继承+用消息通信。 (OO=objects+classes+inheritance+commu...

  • kot

    #Kotlin之班门弄斧 ##面向对象 ##java和kotlin的交互 ##协程及协程框架 ## 面向对象 ...

  • 第六篇:Kotlin之面向对象简单

    上篇:Kotlin之函数Lambda表达式 下篇:Kotlin之面向对象升级(一) Kotlin也支持面向对象的三...

网友评论

      本文标题:Kotlin面向对象之封闭类(Sealed Classes)

      本文链接:https://www.haomeiwen.com/subject/bcptfxtx.html