kotlin提供了一种不通过继承类,和装饰者模式的一种扩展类功的机制
函数扩展
class Number{
fun sum(x:Int,y:Int):Int{
return x + y
}
}
fun main(array: Array<String>){
//通过函数扩展看了Nmumber类的功能
fun Number.three(x:Int,y:Int,z:Int):Int{
return x * y * z
}
val number = Number()
number.three(1,2,3)
}
通过扩展功能,扩展了Number类的功能
扩展是被静态解析的
扩展其实并没有修改它所扩展的类,你并没有在扩展的类中加入新的成员,只是让类的对象能够通过.来调用新的函数
注意:扩展函数是静态分发的,他并不是接受者类型的虚拟方法,-扩展函数是由发起者类型决定的
open class Father
class Son : Father()
fun Father.show() = "father"
fun Son.show() = "son"
fun print(father: Father){
System.out.println(father.show())
}
fun main(array: Array<String>){
print(Son())
}
输出

image.png
可空的接收者
fun Any?.toString():String{
if (this == null) return "null"
return toString()
}
注意:扩展支持空类型扩展,需要在内部判断空,延迟判空到扩展函数内部
属性扩展
class Son
val Son.x:Int get() = 1
fun main(array: Array<String>){
print(Son().x)
}
注意:扩展并不会给类添加属性,因此没有办法让扩展属性拥有一个备份字段,这也是为什么初始化函数不可以有扩展属性。扩展属性只能通过明确的getter setter方法设置
伴随对象扩展
class MyClass {
companion object {
}
}
fun MyClass.Companion.show(){
System.out.println("show")
}