• 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()
    
    • 1
    • 2
    • 3

    在上面的例子中,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}")
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
  • 相关阅读:
    16.13.2 使用CASE语句控制流程
    Kubernetes之Pod初始化容器
    java-php-net-python-书籍租阅管理系统计算机毕业设计程序
    【ONE·C++ || 网络基础(二)】
    大学校园安全如何保障?学到了视频监控的神技!
    A40I工控主板(SBC-X40I)串口通信测试
    迁移学习(PCL)《PCL: Proxy-based Contrastive Learning for Domain Generalization》
    甲方安全建设思考-3
    Solana链,什么是sol跟单机器人、pump跟单机器人、sol狙击机器人、sol夹子机器人、sol聪明钱筛选
    正向代理(流量代理)
  • 原文地址:https://blog.csdn.net/m0_63144319/article/details/138194896