Kotlin密封类

6人阅读 评论(0) 收藏 举报
分类:

密封类用来表示受限的类继承结构:当一个值为有限集中的
类型、而不能有任何其他类型时。在某种意义上,他们是枚举类的扩展:枚举类型的值集合
也是受限的,但每个枚举常量只存在一个实例,而密封类
的一个子类可以有可包含状态的多个实例。

要声明一个密封类,需要在类名前面添加 sealed 修饰符。虽然密封类也可以
有子类,但是所有子类都必须在与密封类自身相同的文件中声明。(在 Kotlin 1.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
}
Kotlin

(上文示例使用了 Kotlin 1.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
    // 不再需要 `else` 子句,因为我们已经覆盖了所有的情况
}
Kotlin
查看评论

Kotlin学习笔记(三)---Kotlin密封类

前言 密封类,可以理解为枚举,规定了有限个类型,不可以存在其他类型,但枚举每个枚举常量只存在一个示例,但是密封类的子类可以有多个示例,所以可以将密封类看做是枚举的拓展,基于枚举,高于枚举,青出于蓝而胜...
  • dazhaoDai
  • dazhaoDai
  • 2017-08-15 19:00:27
  • 255

Kotlin——数据类和密封类

数据类有些类只是用来持有数据的。在这样的类中,一些标准的函数通常是从数据中推导出来的。在Kotlin中,这些类成为数据类并且以data作为标记: data class User(val name: ...
  • qq_19431333
  • qq_19431333
  • 2017-08-17 18:41:04
  • 419

Kotlin-14.密封类(sealed class)

密封类(sealed class)受限的类继承结构(有限集合的类型,不能有任何其他类型); 扩展的枚举类enum,枚举类值集合也受限;sealed class和enum区别;枚举类的每个枚举常量只存在...
  • qq_32115439
  • qq_32115439
  • 2017-06-22 23:38:30
  • 1581

Kotlin系列之密封类

今天说说Kotlin中的密封类。 在Java中没有密封类这个概念,所以就没法和Java进行对比了,主要看看Kotlin中的密封类的出现目的和使用方法。 为什么会出现密封类 我们先不说密封类...
  • bingjianIT
  • bingjianIT
  • 2018-02-06 13:11:36
  • 73

Kotlin学习笔记(七)数据类,密封类,嵌套类,内部类,枚举类

提示:本文为作者阅读Kotlin中文站学习笔记,建议读者移步Kotlin中文站学习完整教程。数据类开发中,我们经常需要创建一些只保存数据的类。Kotlin中,我们用data关键字定义一个数据类,编译器...
  • CSDN_GYG
  • CSDN_GYG
  • 2017-06-14 10:25:17
  • 378

Kotlin 官方学习教程之密封类与泛型

Kotlin 官方学习教程之密封类与泛型
  • jim__charles
  • jim__charles
  • 2017-06-18 19:02:34
  • 403

sealed关键字——密封类

与抽象类相反,在实际编程过程中,有的类已经没有在被继承的必要了。针对这种情况,C#提出了一个密封类的概念。密封类的声明使用sealed关键字,可以防止非有意的派生。如果视图将一个密封类作为基类,C#将...
  • cl110cl
  • cl110cl
  • 2014-03-23 12:20:22
  • 1201

[kotlin系列] (s2_3)扩展、数据类、密封类

扩展译文见这里kotlin支持扩展函数和扩展属性。扩展静态解析的 扩展不会真正的插入成员。 扩展函数是由函数调用的表达式的类型决定的。(而不是类实例) 在函数模型上“一模一样”的成员函数和扩展函数,永...
  • a774057695
  • a774057695
  • 2017-07-31 15:41:49
  • 179

学习kotlin第九天_数据类、枚举类、密封类、嵌套类

加油!加油!加油!克服一切困难,学好kotlin把android项目改改,然后想象一下接手项目的人哭的样子。...
  • xyzeng12
  • xyzeng12
  • 2017-06-02 16:58:12
  • 413

Kotlin编程之伴生对象,抽象类,密封类

Kotlin编程中: 1. 伴生对象; 2. 抽象类; 3. 密封类;
  • hexingen
  • hexingen
  • 2017-05-31 21:10:02
  • 3097
    个人资料
    等级:
    访问量: 9064
    积分: 461
    排名: 10万+
    文章分类
    最新评论