Sealed class

1 其子类可以出现在定义 sealed class 的不同文件中,但不允许出现在与不同的 module 中,且需要保证 package 一致

2 sealed class 是抽象类,可以拥有抽象方法,无法直接实例化。

3 sealed class 的实例,可配合 when 表达式进行判断,当所有类型覆盖后可以省略 else 分支。如果没有覆盖所有类型,也没有 else 统筹则会发生编译警告或错误

4 当 sealed class 没有指定构造方法或定义任意属性的时候,建议子类定义成单例,因为即便实例化成多个实例,互相之间没有状态的区别
5 子类,包括普通 class、data class、object、sealed class 等

 sealed class GameAction(times: Int) {object Start : GameAction(1)data class AutoTick(val time: Int) : GameAction(2)class Exit : GameAction(3)}object Restart : GameAction(4)

判断 sealed class 内部子类类型自然需要指定父类前缀
object class 的话可以直接进行实例判断,也可以用 is 关键字判断类型匹配
普通 class 类型的话则必须加上 is 关键字
判断 sealed class 外部子类类型自然无需指定前缀

 class TestSealed {fun test(gameAction: GameAction) {when (gameAction) {GameAction.Start -> {}// is GameAction.Start -> {}is GameAction.AutoTick -> {}is GameAction.Exit -> {}Restart -> {}}}}

Sealed Interface

 enum class Action {Tick,// GameActionStart, Exit, Restart,// BirdActionUp, Down, HitGround, HitPipe, CrossedPipe,// PipeActionMove, Reset,// RoadAction// 防止和 Pipe 的 Action 重名导致编译出错,// 将功能差不多的 Road 移动和重置 Action 定义加上了前缀RoadMove, RoadReset}fun dispatch(action: Action) {when (action) {Action.Tick -> TODO()Action.Start -> TODO()Action.Exit -> TODO()Action.Restart -> TODO()Action.Up -> TODO()Action.Down -> TODO()Action.HitGround -> TODO()Action.HitPipe -> TODO()Action.CrossedPipe -> TODO()Action.Move -> TODO()Action.Reset -> TODO()Action.RoadMove -> TODO()Action.RoadReset -> TODO()}}

借助 sealed interface 我们可以给抽出 interface,并将 enum 进行层级拆分。更加清晰、亦不用担心重名

 sealed interface Actionenum class GameAction : Action {Start, Exit, Restart}enum class BirdAction : Action {Up, Down, HitGround, HitPipe, CrossedPipe}enum class PipeAction : Action {Move, Reset}enum class RoadAction : Action {Move, Reset}object Tick: Action

使用的时候就可以对抽成的 Action 进行嵌套判断:

 fun dispatch(action: Action) {when (action) {Tick -> TODO()is GameAction -> {when (action) {GameAction.Start -> TODO()GameAction.Exit -> TODO()GameAction.Restart -> TODO()}}is BirdAction -> {when (action) {BirdAction.Up -> TODO()BirdAction.Down -> TODO()else -> TODO()}}is PipeAction -> {when (action) {PipeAction.Move -> TODO()PipeAction.Reset -> TODO()}}is RoadAction -> {when (action) {RoadAction.Move -> TODO()RoadAction.Reset -> TODO()}}}}

Kotlin--Sealed Class Sealed Interface相关推荐

  1. Kotlin 特色之 Sealed Class 和 Interface

    /   今日科技快讯   / 近日,我国在太原卫星发射中心使用长征六号改运载火箭,成功将云海三号卫星发射升空,卫星顺利进入预定轨道,发射任务获得圆满成功.该卫星主要用于开展大气海洋环境要素探测.空间环 ...

  2. Kotlin:关于Sealed密封类

    如果要在Java中列举,我们可能会用Enum,而在Kotlin中,除了Enum以外,还有一個更加强大的工具--Sealed Class. Enum Class 在Kotlin中的枚举类可以写成: en ...

  3. Kotlin Sealed 是什么?为什么 Google 都用

    写这篇文章之前,做了很多调研,查阅了很多资料,文章也反复推敲打磨了很多遍,为什么我要去做这么多的调研工作,因为 Sealed Classes 概念很简单,但是想要写好它很难,由于目前我对 Sealed ...

  4. Kotlin1.5 新特性之 Sealed Interface(密封接口)

    Kotlin 1.5 推出了密封接口(Sealed Interface),这与密封类(Sealed Class)有什么区别呢? 在开始聊密封接口之前先回顾一下密封类的进化史. 密封类的进化史 密封类可 ...

  5. kotlin sealed 中_Kotlin的密封(Sealed)类:超强的枚举(KAD 28)

    Kotlin的密封(Sealed)类:超强的枚举(KAD 28) 作者:Antonio Leiva 时间:Jun 27, 2017 原文链接:https://antonioleiva.com/seal ...

  6. kotlin_基础_密封类(sealed)

    原文链接:https://blog.csdn.net/weixin_41953808/article/details/112499887 Kotlin密封类:sealed 密封类:用来定义受限的类继承 ...

  7. 深入浅出OOP(五): C#访问修饰符(Public/Private/Protected/Internal/Sealed/Constants)

    访问修饰符(或者叫访问控制符)是面向对象语言的特性之一,用于对类.类成员函数.类成员变量进行访问控制.同时,访问控制符也是语法保留关键字,用于封装组件. Public, Private, Protec ...

  8. 快速了解sealed关键字

    sealed关键字 sealed的英文意思就是密封,禁止的意思.在c#中sealed关键字可以用来修饰类和方法.作用于类时不能和abstract对象一起使用,因为使用了sealed修饰类表示此类不能被 ...

  9. Kotlin 1.5 新特性:密封接口有啥用?

    作者 | AndroidPub       责编 | 张红月 出品 | CSDN(ID:CSDNnews) Kotlin 1.5 引入了密封接口(Sealed Interface),这与密封类(Sea ...

  10. Kotlin学习笔记12——数据类和密封类

    Kotlin学习笔记12--数据类和密封类 前言 数据类 在类体中声明的属性 复制 componentN 解构声明 密封类 尾巴 前言 上一篇,我们学习了Kotlin中的拓展,今天继续来学习Kotli ...

最新文章

  1. Leangoo敏捷项目管理软件 6.3.2
  2. 他被导师半夜敲门叫醒:你得诺贝尔奖了!还曾为5G频谱拍卖设计方案,担任谷歌IPO咨询顾问...
  3. Python 面向对象 基础
  4. 为数字世界和通证经济健康发展保驾护航 币氪产品发布会在蓉举行
  5. elk示例-精简版2
  6. 【数据结构】树状数组详解(Leetcode.315)
  7. MarshalByRefObject浅析
  8. 学习笔记(23):Python网络编程并发编程-开启线程的两种方式
  9. console.log打印没有效果
  10. 澳门大学物联网设计方法研究获“973”立项
  11. mysql数据库教程全解_MySQL数据库基础教程详解
  12. python可以画动态图吗_matplotlib 画动态图以及plt.ion()和plt.ioff()的使用详解
  13. (原创)一步一步学ZedBoard Zynq(一):ZedBoard的第一个工程Helloworld
  14. 王者荣耀交流协会final发布-第一次scrum立会
  15. Paypal如何实现循环扣款(订阅)?
  16. [北航软工教学] 教学计划大纲
  17. 电脑上温度符号℃摄氏度怎么打?
  18. 双亲委派模型和破坏性双亲委派模型详解
  19. msr和esp分区有什么用
  20. vue+axios 实现Excel下载

热门文章

  1. asp.net报错:ConnectionString 属性尚未初始化
  2. 使用MySQL的binlog日志恢复误删数据
  3. Gohead学习笔记
  4. BeautifulSoup说明
  5. BeautifulSoup 与 Xpath
  6. 关于Introduction、Discussion的杂记
  7. 管理系统类项目的登陆与权限功能的实现
  8. IOCP的一些思考(粘包,断包的处理)
  9. Java 监控方案_Java 服务端监控方案
  10. 单云台语音跟踪摄像机MHD-G200TH