kotlin数据类与密封类

/**
 * 主构造函数至少包含一个参数
 * 所有的主构造函数的参数必须标识为val 或者var
 * 数据类不可以声明为abstract open、sealed或者inner
 * 数据类不能继承其他类,但是可以实现接口
 */

//关键字为data
data class User(val name:String,val age:Int){

//    fun copy(name: String=this.name,age: Int=this.age)=User(name,age)
}

/****
 *
 * 密封类
 *  受限的类继承结构:当一个值为有限的几种类型,
 *  而不能有任何其他类型时,在某种意义上,他们是枚举类的扩展
 *  枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例
 *  而密封类的一个子类可以有可包含状态的多个实例
 *  sealed
 *  可以有子类,但子类必须内嵌在密封类中
 *密封类
 * 1.密封类用sealed关键词表示
 * 2.密封类的子类只能定义在密封类的内部或同一个文件中,因为其构造方法为私有的
 * 3.密封类相比于普通的open类,可以不被此文件外被继承,有效保护代码
 * 4.与枚举的区别:密封类适用于子类可数的情况,枚举适用于实例可数的情况


 *  sealed不能修饰interface、abstract class
 *
 *
        ***/


sealed class PlayerCmd{
    val playerName :String = "player"

    class Player(val url:String,val position:Long = 0):PlayerCmd(){
        fun showUrl(){
            println("$url ,$position")
        }
    }

    class Seek(val position: Long):PlayerCmd()//快进
    object Pause:PlayerCmd()
}
//(密封类的子类也可以定义在密封类的外部,但要在同一个文件中)
object Resume :PlayerCmd()
object Stop:PlayerCmd()
enum class PlayerState{
    IDLE,PAUSE,PLAYING,STOP
}


fun main(args:Array<String>){
    val jack = User("jack",12)
    val oldjack = jack.copy(age=2)
    println(jack)
    println(oldjack)



    PlayerCmd.Player("苍茫的天涯").showUrl()
    println(Resume.playerName)
    println(Stop.playerName)
}

猜你喜欢

转载自www.cnblogs.com/endian11/p/10860904.html