首页 Kotlin学习笔记(10) - 密封类/接口
文章
取消

Kotlin学习笔记(10) - 密封类/接口

一、密封类

在Kotlin中,密封类(Sealed Class)是一种特殊的类别,用于表示受限的继承结构。密封类在某种程度上类似于枚举,但它可以包含多个实例。最常见的用例就是能够更好的与when函数一起使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//kotlin 1.1 之前子类必须在密封类内部
sealed class Result {
    class Success(val value: Int) : Result()
    class Error(val message: String) : Result()
}


//kotlin 1.5以后完全放宽了这个限制,只要在同一个gradle module即可
sealed interface Error

sealed class IOError(): Error

class FileReadError(val file: File): IOError()
class DatabaseError(val source: DataSource): IOError()

object RuntimeError : Error

主要特性和用法

  • 有限的继承结构
  • 能够更好的应用在when表达式,因为子类时有限的,编译器可以检查到,从而可以省略else结构
  • 可提供类似枚举的行为,例如:页面的加载状态,网络请求的状态等
  • 可包含属性或方法更灵活
  • 不能直接实例化,只能通过子类,这确保了密封类是有限的。

二、密封接口

kotlin1.5添加了密封接口,主要是目的是为了处理以下问题

  1. 多继承问题:能够和密封类搭配使用变相的去处理多继承问题,例如:苹果即是水果也是食物,实际中可能存在很多类似关系
  2. 实现final类型的接口:如一些第三方sdk开发,有些接口是不希望让其他人使用则可声明为封闭接口
  3. 枚举嵌套:本质上枚举都是继承了Enum,由于单继承的限制,无法再继承其他,但通过实现密封接口来实现嵌套枚举

三、总结

密封类/接口本质上其实与普通类/接口是一致的,主要目的是

  • 更好的结合when语句
  • 不希望对外暴露
本文由作者按照 CC BY 4.0 进行授权

Kotlin学习笔记(9) - 数据类

Kotlin学习笔记(11) - 嵌套类/枚举类/inline value class