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()
    }
}
相關文章
相關標籤/搜索