在上一篇 Kotlin学习之路–面向对象 中我们介绍了Kotlin类和接口的使用方法,这些类的使用与Java的有相似的概念,而今天介绍一下Kotlin的Sealed类(密封类),这是在Java中没有的概念
Sealed class(密封类) 是一个有特定数量子类的类,看上去和枚举有点类似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。
Sealed class(密封类)的所有子类都必须与密封类在同一文件中
Sealed class(密封类)的子类的子类可以定义在任何地方,并不需要和密封类定义在同一个文件中
Sealed class(密封类)没有构造函数,不可以直接实例化,只能实例化内部的子类
Sealed class使用场景一
我们先写一个密封类
sealed class SealedClass{
class SealedClass1():SealedClass()
class SealedClass2():SealedClass()
fun hello(){
println("Hello World ... ")
}
}1234567
这时候我们想调用SealedClass里面的Hello方法怎么调用
fun main(args:Array<String>){ var sc:SealedClass = SealedClass()//这里直接编译报错}123
正确的使用姿势:
fun main(args:Array<String>){ var sc:SealedClass = SealedClass.SealedClass1()//只能通过密封类内部的子类实例化对象,这时就可以执行里面的方法了
sc.hello()
}1234
Sealed class使用场景二
sealed class Mathematics(){
data class Dou(val number: Double) : Mathematics()
data class Sub(val e1: Mathematics, val e2: Mathematics) : Mathematics()
object NotANumber : Mathematics()
fun eval(m: Mathematics): Double = when(m) { is Dou -> {
m.number
} is Sub -> eval(m.e1) - eval(m.e2)
NotANumber -> Double.NaN
}
}
fun main(args:Array<String>){
var ec1:Mathematics = Mathematics.Dou(5.0)
var d1 = ec1.eval(ec1)
println(d1)
var ec2:Mathematics = Mathematics.Sub(ec1, Mathematics.Dou(3.0))
var d2 = ec2.eval(ec2)
println(d2)
var ec3:Mathematics = Mathematics.NotANumber
var d3 = ec3.eval(ec3)
println(d3)
}
结果输出:5.02.0NaN123456789101112131415161718192021222324252627282930313233