kotlin扩展函数

//kotlin的类,甚至都不须要花括号
class User(var name:String)

/**
 * 扩展函数(Extension Function)
 * 在类中添加新的方法,不对原类进行修改,扩展函数形式定义:
 *  fun receiverType.functionName(params){
 *      body
 *  }
 *  扩展是一种静态行为,对被扩展的类代码自己不会形成任何影响。
 *
 *  receiverType:表示函数的接收者,也就是函数扩展的对象
    functionName:扩展函数的名称
    params:扩展函数的参数,能够为NULL
 */
fun User.print(){
    println("hello,your name is :$name")
}
fun main(args:Array<String>){
    val user = User("Lee")
    user.print()

    val l = mutableListOf(1,2,3)
    l.swap(0,2)
    println(l.toString())

}





fun MutableList<Int>.swap(index1:Int,index2:Int){
    //this关键字指代接收者对象
    val tmp  = this[index1]
    this[index1] = this[index2]
    this[index2] = tmp
}

 

 

open class C


class D:C()

fun C.foo()="c"

fun D.foo()="D"

fun printFoo(c:C){
    println(c.foo())
}


fun main(args:Array<String>){
    /**
     * 扩展函数是静态解析的,并非接收者类型的虚拟成员
     * 在调用扩展函数时,具体被调用的是哪个函数,由调用
     * 函数的对象表达式来决定的,而不是动态的类型决定的
     */
    val d = D()
    printFoo(d)


    var t = null
    println(t.toString())
}

/**
 * 扩展一个空对象
 * 在扩展函数内,能够经过this来判断接收者是否
 * 为null,这样即便接收者为null也能够调用扩展函数
 *
 */
fun Any?.toString():String{
    if (this == null){
        return "NULL"
    }else{
        return toString()
    }
}
/**
 * 扩展属性
 * 除了函数,kotlin也支持属性对属性进行扩展
 */

 

 

- 扩展声明为成员函数

fun main(args:Array<String>){

    val c = C()
    val d = D()
    c.caller(d)


}

class D{
    fun bar(){
        println("D bar")
    }
}

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

    /**
     * 在C类内,建立了D类的扩展,此时,C被成为分发接收者,
     * 而D为扩展接收者,
     */
    fun D.foo(){
        bar()
        baz()
    }

    fun caller(d: D){
        d.foo()
    }
}
相关文章
相关标签/搜索