Kotlin中函数的扩展

与Java不同的是,Kotlin可以对一个类的属性和方法进行扩展。

1.扩展函数的定义格式

fun functionType.functionName(params){

       函数体

}

functionType:要扩展函数的对象,表示函数的接收者

functionName:扩展函数的名称

params:扩展函数的参数

class Animation(var name: String) 

/**
 * 扩展函数:在已有类中添加新的方法,不会对原类做修改
 */
fun Animation.Print() {
    println("用户名:${name}")
    println("扩展函数")
}
fun main(args: Array<String>) {
    var animation = Animation("Kotlin")
    animation.Print()
}

用户名:Kotlin
扩展函数

2.伴生对象的扩展

如果一个类定义有一个伴生对象 ,你也可以为伴生对象定义扩展函数和属性。

伴生对象通过"类名."形式调用伴生对象,伴生对象声明的扩展函数,通过用类名限定符来调用:

class MyClass {
    companion object {}
}

fun MyClass.Companion.foo() {
    println("伴生对象的扩展函数")
}

val MyClass.Companion.no: Int  //扩展属性
    get() = 100

fun main(args: Array<String>) {
    println("no:${MyClass.no}")
    MyClass.foo()
}

no:100
伴生对象的扩展函数

这里有写到属性的扩展:

扩展属性  允许定义在Kotlin文件中,不允许定义在函数中,不允许初始化,只能显示定义getter 、setter方法,并且扩展属性只能被声明为val

3.在一个类的内部可以为另一个类声明扩展

***
 * 在一个类的内部可以为另一个类声明扩展
 * 在这个扩展中,有多个隐含的接受者,
 * 其中扩展方法定义所在类的实例称为分发接收者
 * 而扩展方法的目标类实例称为扩展接收者
 */
class P {
    fun bar() {
        println("P bar")
    }
}

class O {
    fun baz() {
        println("O baz")
    }

    //在O类中创建P类的扩展函数,在这个扩展函数中,可以调用本类也就是O类的函数,也可以 调用被扩展类的函数即P类中的函数
    fun P.foo() {
        bar() //
        baz()
    }

    fun caller(p: P) {
        p.foo()  //调用扩展函数
    }
}
fun main(args: Array<String>) {
    val p: P = P()
    val o: O = O()
    o.caller(p)
}
P bar
O baz

猜你喜欢

转载自blog.csdn.net/qq_37982823/article/details/87931383