Kotlin语法入门-密封类和密封接口(11)

Kotlin语法入门-密封类和密封接口(11)

文章目录

十一、密封类和密封接口

1、密封类

  • 在Kotlin中,密封类(Sealed Class)是一种特殊的类,用于表示受限制的类继承结构

  • 密封类可以有子类 ,但是这些子类必须嵌套在密封类的内部同一个文件中,这样就限制了密封类的继承结构。

  • 密封类通常用于表示有限的类层次结构,例如表示状态的类或操作的类。

密封类的定义方式如下:

kotlin 复制代码
sealed class Result
data class Success(val data: String) : Result()
data class Error(val message: String) : Result()

在上面的例子中,Result是一个密封类,它有两个子类Success和Error。这两个子类都嵌套在Result类的内部。由于Result是一个密封类,因此它的子类是有限的,并且都是在同一个文件中定义的。

密封类的特点包括:

  1. 子类有限:密封类的子类是有限的,且必须嵌套在密封类内部或同一个文件中。
  2. 类型推断:使用密封类时,可以通过类型推断来处理所有可能的子类,而不需要使用else语句。
  3. 安全性:密封类提供了更严格的类继承结构,可以帮助开发者避免遗漏某些情况的处理。

使用密封类可以帮助我们更清晰地表示有限的类层次结构,提高代码的可读性和安全性。密封类在处理状态、操作等有限的情况时非常有用。

可以把密封类理解成枚举抽象的结合。

  • 密封类无法实例化,智能继承。

可以使用密封类来模拟登录和登出的操作:

kotlin 复制代码
/**
 * 主函数,程序的入口点。
 * 实现了用户登录和退出登录的处理。
 */
fun main() {
    // 处理用户登录请求
    handerMainIntent(MainIntent.Login("李明", "123456"))
    // 处理用户退出登录请求
    handerMainIntent(MainIntent.Logout)
}

/**
 * 主意图 sealed 类,用于封装所有主功能的操作。
 */
sealed class MainIntent {
    /**
     * 用户登录意图数据类。
     * @param username 用户名。
     * @param password 密码。
     */
    data class Login(val username: String, val password: String) : MainIntent()

    /**
     * 用户退出登录意图。
     */
    object Logout : MainIntent()
}

/**
 * 处理主意图的函数。
 * 根据传入的 MainIntent 对象执行相应的操作。
 * @param mainIntent 用户的主意图,可以是登录或退出登录。
 */
fun handerMainIntent(mainIntent: MainIntent) {
    when (mainIntent) {
        is MainIntent.Login -> userLoginRequest(mainIntent.username, mainIntent.password) // 处理用户登录请求
        MainIntent.Logout -> println("退出登录.....") // 处理用户退出登录请求
    }
}

/**
 * 处理用户登录请求的函数。
 * @param username 用户名。
 * @param password 密码。
 * 打印用户登录信息。
 */
fun userLoginRequest(username: String, password: String) {
    println("用户登录:${username} ${password}")
}

2、密封接口

与密封类枚举抽象 的结合类似,密封接口就相当于是枚举接口的结合。

下面是一个游戏数据模拟的一段代码:

kotlin 复制代码
fun main() {

}

fun handerHealth(role: Weapon) {
    when (role) {
        is PlayerType1 -> println("玩家1")
        is PlayerType2 -> println("玩家2")
        is PlayerType3 -> println("玩家3")
        is EnemyType1 -> println("敌人1")
        is EnemyType2 -> println("敌人2")
        is EnemyType3 -> println("敌人3")
    }
}
fun handerWeapon(role: Weapon) {
    when (role) {
        is PlayerType1 -> println("玩家1")
        is PlayerType2 -> println("玩家2")
        is PlayerType3 -> println("玩家3")
        is EnemyType1 -> println("敌人1")
        is EnemyType2 -> println("敌人2")
        is EnemyType3 -> println("敌人3")
    }
}


sealed interface Health {}
sealed interface Weapon {}
class PlayerType1 : Health, Weapon
class PlayerType2 : Health, Weapon
class PlayerType3 : Health, Weapon
class EnemyType1 : Health, Weapon
class EnemyType2 : Health, Weapon
class EnemyType3 : Health, Weapon
相关推荐
低调小一6 分钟前
Kotlin 2025–2026 客户端开发路线:语言升级 × 跨端落地 × AI Agent 入门
开发语言·人工智能·kotlin
研☆香17 分钟前
JS中的三种显示弹窗
开发语言·前端·javascript
王夏奇22 分钟前
python中的基础知识点-1
开发语言·windows·python
叫我辉哥e123 分钟前
新手进阶Python:办公看板集成多数据源+ECharts高级可视化
开发语言·python·echarts
猛扇赵四那边好嘴.23 分钟前
Flutter 框架跨平台鸿蒙开发 - 问答社区应用开发教程
开发语言·javascript·flutter·华为·harmonyos
C_心欲无痕25 分钟前
Next.js 路由系统对比:Pages Router vs App Router
开发语言·前端·javascript
LawrenceLan28 分钟前
Flutter 零基础入门(二十二):Text 文本组件与样式系统
开发语言·前端·flutter·dart
kylezhao201933 分钟前
C# 各种类型转换深入剖析
开发语言·c#
hxjhnct36 分钟前
JavaScript 的 new会发生什么
开发语言·javascript
少控科技40 分钟前
QT进阶日记004
开发语言·qt