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

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

十一、密封类和密封接口

1、密封类

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

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

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

密封类的定义方式如下:

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. 安全性:密封类提供了更严格的类继承结构,可以帮助开发者避免遗漏某些情况的处理。

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

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

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

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

/**
 * 主函数,程序的入口点。
 * 实现了用户登录和退出登录的处理。
 */
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、密封接口

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

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

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

相关推荐

  1. Kotlin语法入门-密封密封接口(11)

    2024-04-25 19:18:04       11 阅读
  2. Kotlin 密封接口

    2024-04-25 19:18:04       39 阅读
  3. Kotlin密封、枚举密封接口的对比分析

    2024-04-25 19:18:04       38 阅读
  4. Kotlin(十三) 延迟初始化密封

    2024-04-25 19:18:04       36 阅读
  5. 11kotlin 对象 -- 普通

    2024-04-25 19:18:04       42 阅读
  6. kotlin语法快速入门-接口接口实现(8)

    2024-04-25 19:18:04       10 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-25 19:18:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-25 19:18:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-25 19:18:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-25 19:18:04       18 阅读

热门阅读

  1. MyBatis-动态sql常见使用

    2024-04-25 19:18:04       13 阅读
  2. h5 常见面试问题

    2024-04-25 19:18:04       10 阅读
  3. 如何在Chrome中设置无痕模式

    2024-04-25 19:18:04       13 阅读
  4. 云原生周刊:Kubernetes v1.30 发布 | 2024.4.22

    2024-04-25 19:18:04       25 阅读