Kotlin学习笔记之扩展

80 阅读2分钟
扩展函数
// 1、Kotlin能够扩展一个类的新功能而无需继承该类或者采用像装饰者这样的设计模式去扩展已有类  2021/6/22
open class Extend(){
    // 2、使用时,需要用接收类型也就是被扩展的类型作为前缀去定义一个新的方法  2021/6/22
    fun VisibilityDemo.show(){
        println("Extend show")
        // 3、定义的扩展函数访问成员变量时,同样遵循可见性修饰符规则  2021/6/22
        println(this.c)
        // 4、在扩展函数内可以用this关键字代表接收者对象  2021/6/22
        println(this.d)
    }
​
    fun test(){
        val visibilityDemo = VisibilityDemo()
        visibilityDemo.show()
    }
}
​
// 5、扩展是静态解析的,扩展并不能真正的修改所扩展的类,只是通过该类型的变量用点表达式去掉用这个扩展函数,并没有在扩展类中插入这个函数  2021/6/22
class SubExtend():Extend(){
    fun Extend.demo(){
        println("Extend.demo")
    }
    fun SubExtend.demo(){
        println("SubExtend.demo")
    }
​
    fun run(extend: Extend){
        extend.demo()
    }
    // 6、 扩展属性 ,与扩展函数类似 2021/6/22
//    val Extend.name = "this is my name" // 错误:扩展属性不能有初始化器  2021/6/22
    val Extend.name
    get() = ""
    
    fun make(){
        println("这是SubExtend中已有的方法")
    }
    fun SubExtend.make(){
        println("这是SubExtend的扩展方法,永远不会被调用")
    }
}
fun main(){
    // 7、此处调用的是Extend的扩展函数,调用哪个对象的扩展函数是由函数调用所在的表达式的类型决定的
    // 而不是有表达式运行时求值结果决定的   2021/6/22
    SubExtend().run(SubExtend())
    
    
    // 8、如果扩展了一个类已经存在的函数,包括函数名、参数个数、顺序、以及参数类型和返回值都相同,
    // 那么此时扩展的函数永远不会被调用,比如以下的调用,返回的永远是"这是SubExtend中已有的方法"
    SubExtend().make()
}
​

扩展属性

由于扩展并没有实际的将属性插入到类中,所以扩展属性没有幕后字段,也就是说扩展属性没有初始化器,只能由显示提供的getter定义

val SubExtend.varialble : Int
    get() = 1

伴生对象的扩展

// 如果一个类有伴生对象,可以为其定义扩展函数和属性, 2021/11/4
class SubExtendCla{
    companion object {
        fun method(){
        }
    }
}
​
fun main1(){
    fun SubExtendCla.Companion.method2(){
        println("这是扩展的伴生对象的方法")
    }
}

\