Kotlin:扩展

kotlin提供了一种不通过继承类,和装饰者模式的一种扩展类功的机制

函数扩展

class Number{
    fun sum(x:Int,y:Int):Int{
        return x + y
    }

}

fun main(array: Array){

    //通过函数扩展看了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){
    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){
    print(Son().x)
}

注意:扩展并不会给类添加属性,因此没有办法让扩展属性拥有一个备份字段,这也是为什么初始化函数不可以有扩展属性。扩展属性只能通过明确的getter setter方法设置

伴随对象扩展

class MyClass {
    companion object {

    }
}

fun MyClass.Companion.show(){
    System.out.println("show")
}

你可能感兴趣的:(Kotlin:扩展)