sealed class(密封类)

基本特性:

  • 声明一个密封类在类名使用 sealed 修饰符
  • 所有子类都必须在与密封类自身相同的文件中声明(子类的扩展类不受此控制)
  • 密封类是抽象的,故而不能实例化,且可以拥有抽象方法。
  • 密封类不允许有非-private 构造函数(其构造函数默认为 private)

和枚举类相似,所不同的是,在枚举中,我们每个类型只有一个对象(实例);而在密封类中,同一个类可以拥有几个对象。

  1. sealed class Animal
  2. class Bird(var name: String) : Animal()
  3. class Fish(var name: String) : Animal()

使用场景:

  1. fun main(args: Array<String>) {
  2. val animalName = getAnimalName(Fish("鲨鱼"))
  3. print(animalName)
  4. }
  5. fun getAnimalName (animal:Animal):String =when(animal){
  6. is Bird -> "鸟类:"+animal.name
  7. is Fish -> "鱼类:"+animal.name
  8. }
  9. sealed class Animal
  10. class Bird(var name: String) : Animal()
  11. class Fish(var name: String) : Animal()

注:使用密封类的关键好处在于使用 when 表达式 的时候,如果能够验证语句覆盖了所有情况,就不需要为该语句再添加一个 else 子句了