0


Kotlin学习之密封类

Kotlin中的密封类:

kotlin中的密封类,用关键词Sealed修饰,且还有一个规定:Sealed类的子类应该是Sealed类的嵌套类,或者应该在与Sealed类相同的文件中声明。
当我们想定义一个有相同父类,但是有不同子类的时候,我们可以用枚举,抽象类,密封类来表示。
下面一一讲解它们之间的区别。

1. 枚举

enumclassResult(valdata: String){SUCCESS("Success"),ERROR("Error")}

但是如果我们ERROR中想定义一个Exception,那么枚举类是不允许的。

enumclassResult(val message: String){SUCCESS("Success"),ERROR(val exception: Exception)// 错误的写法}

说到底,枚举它不能很好的扩展子类的状态

2. 密封类

sealedclass Result
dataclassSuccess(val msg: String):Result()dataclassError(val errorCode: Int,val exception: Exception):Result()object Other :Result()

可以看到,密封类的好处是,它的子类可以是普通类,data class, object等,而且子类可以自由扩展属性状态
另外,密封类的另外一个好处是,当我们用when的时候,不用再加else 判断了

when(val result: Result =Success("success")){is Success ->{
                Log.d("TAG", result.msg)}is Error ->{
                Log.d("TAG","$result.errorCode")}is Other ->{
                Log.d("TAG","Other")}}

3. 抽象类

我们将Result改成抽象类

abstractclass Result
dataclassSuccess(val msg: String):Result()dataclassError(val errorCode: Int,val exception: Exception):Result()object Other :Result()

在when中使用的时候,编译器会提示我们要加else分支。但是在密封类中,就不会存在这个问题,因为编译器知道密封类所有的子类,但是抽象类不一样了,因为我们可以在任意地方来继承实现子类,子类可能是很多的,所以需要加上else分支。
在这里插入图片描述

标签: kotlin

本文转载自: https://blog.csdn.net/huang_xiao_yu/article/details/132558143
版权归原作者 huang_xiao_yu 所有, 如有侵权,请联系我们删除。

“Kotlin学习之密封类”的评论:

还没有评论