//kotlin 扩展
//kotlin 可以对一个类的属性或者方法进行扩展,且不需要继承或者使用Decorator模式
//扩展是一种静态行为,对扩展的类本身不会造成影响。
//扩展函数
//扩展函数可以在已有的类中添加新的方法,不会对原有的类做修改,扩展函数定义形式
// fun receiverType.functionName(params){
// body
// }
// receiverType 表示函数的接收者,也就是函数扩展的对象
// functionName 函数扩展的名称
// 扩展函数的参数,可以为NULL
class User(name:String){
var name:String? = null
init {
this.name = name
}
}
fun User.println(){
println("用户名:$name")
}
fun MutableList<Int>.swap(index:Int,index2:Int){
val tem = this[index]
this[index] = this[index2]
this[index2] = tem
}
//扩展空对象
//在扩展函数时,可以通过this来判断接收者是否为null,这样,即使接收者为null,也可以调用扩展函数
fun Any?.toString():String{
if(this == null) return "NULL"
return toString()
}
//扩展属性 除了函数,kotlin也支持属性对属性的扩展
val <T> List<T>.lastIndex:Int
get() = size-1
fun main(args:Array<String>){
println("hello world")
var test = User("jack")
test.println()
val l = mutableListOf(1,2,3)
l.swap(0,2)
println(l)
var lala = null
println(lala.toString())
println(l.lastIndex)
}
//kotlin数据类与密封类
//kotlin可以创建一个只包含数据的类,关键字为data
//编译器会自动从主构造函数中根据所有的属性提取一下函数:
//equals()/hashCode()toString() componenN() functions对应属性按声明顺序排列 copy()函数
//如果这些函数在类中已经定义或者在超类中继承而来,就不再生成
//为类保证生成代码的一致性以及意义,数据类需要满足一下条件
//1.主构造函数必须有一个参数
//2.所有的主构造函数的参数必须标示为var或者val
//3.数据类不能声明为abstract inner open 或者sealed
//4.数据类不能继承其他类(但是可以实现接口)
data class User2(var name:String,var age:Int)
fun main(args:Array<String>){
var jack = User2("jack",12)
var jack2 = jack.copy(age=123)
println(jack)
println(jack2)
//数据类解构声明
var(name,age) = jack
println("name is $name,age is $age")
}
//密封类用来表示受限的类的继承结构:当一个值为有限几种的类型,而不能有任何其他类型时。
//在某种意义上,他们是枚举类的扩展:枚举类型的值集合也是受限的,但每个枚举常量只存在一个实例,而密封类的一个子类
//可以有可包含状态的多个实例。
//声明一个密封类,使用sealed关键字修饰类,密封类可以有子类,但所有的子类要内嵌在密封类中
//sealed 不能修饰interface abstract class