美文网首页
kotlin-Scaled密封类

kotlin-Scaled密封类

作者: Method | 来源:发表于2021-06-18 09:35 被阅读0次

介绍

当对象具有来自有限集的类型之一(密封类对子类有限制),但不能具有任何其他类型时,使用密封类。(例如网络请求数据只能是请求成功、请求失败)

class Expr
class Const(val value: Int) : Expr
class Sum(val left: Expr, val right: Expr) : Expr

fun eval(e: Expr): Int =
        when (e) {
            is Const -> e.value
            is Sum -> eval(e.right) + eval(e.left)
            else ->
                throw IllegalArgumentException("Unknown expression")
        }

如果添加一个新的类(NotANumber)上边会走else。下边Sealed会在编译时提示你。

sealed class Expr
class Const(val value: Int) : Expr()
class Sum(val left: Expr, val right: Expr) : Expr()
object NotANumber : Expr()


fun eval(e: Expr): Int =
        when (e) {
            is Const -> e.value
            is Sum -> eval(e.right) + eval(e.left)
            NotANumber -> java.lang.Double.NaN
        }

使用Demo

网络请求 数据回调covert

/**
 * 密封类
 * 转换接口请求的数据
 * success 数据正常返回
 * error 数据异常情况
 */
sealed class ApiResult<out T:Any> {
    data class Success<out T:Any>(val data:T):ApiResult<T>()
    data class Error(var errorCode:ErrorCode,var errorMsg:String):ApiResult<Nothing>()
}
enum class ErrorCode{
    NETERROR,
    ERROR,
    NOTLOGIN
}

class Repository {

    fun login(phone:String,pwd:String):ApiResult<String>{
        //请求接口 api.login()
        //转换接口请求数据
        return if (phone.isNotEmpty()){
            ApiResult.Success("success")
        }else{
            ApiResult.Error(ErrorCode.ERROR,"找不到www.xxx.com")
        }
    }
}
class LoginModule {
    val repo by lazy { Repository() }
    fun login(){
        val result = repo.login("1232131231", "123")
        when(result){
            is ApiResult.Success ->{
                println(result.data)
            }
            is ApiResult.Error ->{
                when(result.errorCode){
                    ErrorCode.ERROR ->{}
                    ErrorCode.NOTLOGIN ->{}
                }
            }
        }
    }
}

注意事项

  • 所有子类必须在密封类同一文件声明
  • 密封类是抽象的不能实例化
  • 不能创建非私有构造函数,因为默认是private的

参考地址

https://www.imangodoc.com/10602.html

https://www.cnblogs.com/Jetictors/p/8157969.html

相关文章

  • kotlin-Scaled密封类

    介绍 当对象具有来自有限集的类型之一(密封类对子类有限制),但不能具有任何其他类型时,使用密封类。(例如网络请求数...

  • 12.Kotlin泛型与协变及逆变原理剖析

    1.密封类 密封类(sealed class)①密封类用来表示受限的类继承结构,对密封类中的某个值来说,它所属类型...

  • 密封类

    密封类:断子绝孙 如果我们的类是密封类,那么就意味着不能有任何派生类。 但是密封类是可以拥有父类 C#中密封类使用...

  • 密封类,密封方法

    密封:sealed 对于类,不能被继承(任何类都不能继承) 对于方法不能被重写。 “sealed”,只能写在重写的...

  • 密封类

    using System; namespace _密封类 { class MainClass { public s...

  • 密封类

    密封类的关键词为sealed 他是一种特殊的抽象类,无法被实例化。 它的构造函数是private的,这将使其只能在...

  • Kotlin 密封类 Sealed的总结

    概念sealed修饰的类 在kotlin中是密封类 密封类 描述的是 父类和子类的关系1、密封类和它的子类必须定义...

  • Android MVI 设计模式(3)

    我们用 kotlin 的 sealed 类密封一些数据类,kotlin 提供的密封类类似于枚举,密封类用于定义一种...

  • Kotlin学习之密封类

    Kotlin学习之密封类 密封类是Kotlin中的一个高级类,有如下特点: 密封类是为继承设计的,是一个抽象类; ...

  • kotlin sealed密封类

    kotlin中sealed关键字修饰的类就是密封类。密封类其实是一种特殊的抽象类,专门用于派生子类的。 密封类的特...

网友评论

      本文标题:kotlin-Scaled密封类

      本文链接:https://www.haomeiwen.com/subject/wfkkyltx.html