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
相关推荐
机器视觉知识推荐、就业指导1 小时前
面试问题详解五:Qt 信号与槽的动态管理
开发语言·qt
四维碎片7 小时前
【Qt】线程池与全局信号实现异步协作
开发语言·qt·ui·visual studio
IT码农-爱吃辣条7 小时前
Three.js 初级教程大全
开发语言·javascript·three.js
☺����8 小时前
实现自己的AI视频监控系统-第一章-视频拉流与解码2
开发语言·人工智能·python·音视频
染翰8 小时前
lua入门以及在Redis中的应用
开发语言·redis·lua
王者鳜錸8 小时前
PYTHON让繁琐的工作自动化-函数
开发语言·python·自动化
兔老大RabbitMQ9 小时前
git pull origin master失败
java·开发语言·git
tt5555555555559 小时前
C/C++嵌入式笔试核心考点精解
c语言·开发语言·c++
xiao助阵9 小时前
python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
开发语言·python
科大饭桶10 小时前
C++入门自学Day14-- Stack和Queue的自实现(适配器)
c语言·开发语言·数据结构·c++·容器