Kotlin:扩展

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")
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容