本文概述
- 密封等级声明
- 密封课时
当对象具有受限集中的一种类型但不能具有任何其他类型时, 使用密封类。
密封类的构造函数默认情况下是私有的, 不能被允许为非私有的。
密封等级声明
sealed class MyClass
密封类的子类必须在与密封类本身相同的文件中声明。
sealed class Shape{class Circle(var radius: Float): Shape()class Square(var length: Int): Shape()class Rectangle(var length: Int, var breadth: Int): Shape() object NotAShape : Shape()}
密封类通过仅在编译时限制类型集来确保类型安全的重要性。
sealed class A{class B : A(){class E : A() //this works.}class C : A()init {println("sealed class A")}}class D : A() //this works{class F: A() //This won't work, because sealed class is defined in another scope.}
密封类隐式是不能实例化的抽象类。
sealed class MyClassfun main(args: Array<
String>
){var myClass = MyClass() //compiler error. sealed types cannot be instantiated.}
密封课时密封类通常与when表达式一起使用。由于密封类的子类具有其自身的类型, 因此是一种情况。因此, 当密封类中的表达式涵盖所有情况时, 请避免添加else子句。
例如:
sealed class Shape{class Circle(var radius: Float): Shape()class Square(var length: Int): Shape()class Rectangle(var length: Int, var breadth: Int): Shape()//object NotAShape : Shape()}fun eval(e: Shape) =when (e) {is Shape.Circle ->
println("Circle area is ${3.14*e.radius*e.radius}")is Shape.Square ->
println("Square area is ${e.length*e.length}")is Shape.Rectangle ->
println("Rectagle area is ${e.length*e.breadth}")//else ->
"else case is not require as all case is covered above"//Shape.NotAShape ->
Double.NaN}fun main(args: Array<
String>
) {var circle = Shape.Circle(5.0f)var square = Shape.Square(5)var rectangle = Shape.Rectangle(4, 5)eval(circle)eval(square)eval(rectangle)}
输出:
Circle area is 78.5Square area is 25Rectagle area is 20
推荐阅读
- Kotlin set接口
- Kotlin return跳转表达式
- Kotlin正则表达式
- Kotlin正则表达式模式
- Kotlin反射
- Kotlin递归函数
- Kotlin运算符
- Kotlin Null安全类型
- Kotlin嵌套try-catch块