我相信:能考第一名的那個人,一定是每一科都不會差,哪怕是政治、地理這樣的科目。而我們身邊最優秀的人,也會把每一件事都盡力做好,不管是大事還是小事,是涉及自己或是別人。
1. 概念:
kotlin 可以對乙個類的屬性和方法進行擴充套件,且不需要繼承或使用 decorator 模式。
擴充套件是一種靜態行為,對被擴充套件的類**本身不會造成任何影響。
2. 擴充套件函式:
擴充套件函式可以在已有類中新增新的方法,不會對原類做修改,擴充套件函式定義形式:
fun receivertype.functionname(params)
以下例項擴充套件 user 類 :
class user(var name:string)
/**擴充套件函式**/
fun user.print()
fun main(arg:array)
例項執行輸出結果為:
使用者名稱 runoob
下面**為 mutablelist 新增乙個swap 函式:
// 擴充套件函式 swap,調換不同位置的值
fun mutablelist.swap(index1: int, index2: int)
fun main(args: array)
例項執行輸出結果為:
[3, 2, 1]this關鍵字指代接收者物件(receiver object)(也就是呼叫擴充套件函式時, 在點號之前指定的物件例項)。
3. 擴充套件函式是靜態解析的
擴充套件函式是靜態解析的,並不是接收者型別的虛擬成員,在呼叫擴充套件函式時,具體被呼叫的的是哪乙個函式,由呼叫函式的的物件表示式來決定的,而不是動態的型別決定的:
open class c
class d: c()
fun c.foo() = "c" // 擴充套件函式 foo
fun d.foo() = "d" // 擴充套件函式 foo
fun printfoo(c: c)
fun main(arg:array)
例項執行輸出結果為:
c若擴充套件函式和成員函式一致,則使用該函式時,會優先使用成員函式。
class c
}fun c.foo()
fun main(arg:array)
例項執行輸出結果為:
成員函式4. 擴充套件乙個空物件
在擴充套件函式內, 可以通過 this 來判斷接收者是否為 null,這樣,即使接收者為 null,也可以呼叫擴充套件函式。例如:
fun any?.tostring(): string
fun main(arg:array)
例項執行輸出結果為:
null
擴充套件屬性除了函式,kotlin 也支援屬性對屬性進行擴充套件:
val list.lastindex: int
get() = size - 1
擴充套件屬性允許定義在類或者kotlin檔案中,不允許定義在函式中。初始化屬性因為屬性沒有後端字段(backing field),所以不允許被初始化,只能由顯式提供的 getter/setter 定義。
val foo.bar = 1 // 錯誤:擴充套件屬性不能有初始化器
擴充套件屬性只能被宣告為 val。
5. 伴生物件的擴充套件
如果乙個類定義有乙個伴生物件 ,你也可以為伴生物件定義擴充套件函式和屬性。
伴生物件通過"類名."形式呼叫伴生物件,伴生物件宣告的擴充套件函式,通過用類名限定符來呼叫:
class myclass // 將被稱為 "companion"
}fun myclass.companion.foo()
val myclass.companion.no: int
get() = 10
fun main(args: array) ")
myclass.foo()
}
例項執行輸出結果為:
no:10
伴隨物件的擴充套件函式
6. 擴充套件的作用域
通常擴充套件函式或屬性定義在頂級包下:
package foo.bar
fun baz.goo()
要使用所定義包之外的乙個擴充套件, 通過import匯入擴充套件的函式名進行使用:
package com.example.usage
import foo.bar.goo // 匯入所有名為 goo 的擴充套件
// 或者
import foo.bar.* // 從 foo.bar 匯入一切
fun usage(baz: baz)
7. 擴充套件宣告為成員
在乙個類內部你可以為另乙個類宣告擴充套件。
在這個擴充套件中,有個多個隱含的接受者,其中擴充套件方法定義所在類的例項稱為分發接受者,而擴充套件方法的目標型別的例項稱為擴充套件接受者。
class d
}class c
fun d.foo()
fun caller(d: d)
}fun main(args: array)
例項執行輸出結果為:
d bar
c baz
在 c 類內,建立了 d 類的擴充套件。此時,c 被成為分發接受者,而 d 為擴充套件接受者。從上例中,可以清楚的看到,在擴充套件函式中,可以呼叫派發接收者的成員函式。
假如在呼叫某乙個函式,而該函式在分發接受者和擴充套件接受者均存在,則以擴充套件接收者優先,要引用分發接收者的成員你可以使用限定的 this 語法。
class d
}class c // 與 d 類 的 bar 同名
fun d.foo()
fun caller(d: d)
}fun main(args: array)
例項執行輸出結果為:
d bar
c bar
以成員的形式定義的擴充套件函式, 可以宣告為 open , 而且可以在子類中覆蓋. 也就是說, 在這類擴充套件函式的派 發過程中, 針對分發接受者是虛擬的(virtual), 但針對擴充套件接受者仍然是靜態的。
open class d
class d1 : d()
open class c
open fun d1.foo()
fun caller(d: d)
}class c1 : c()
override fun d1.foo()
}fun main(args: array)
例項執行輸出結果為:
d.foo in c
d.foo in c1
d.foo in c
Android Kotlin問題總結
kotlin雖然已經在2017年5月18日的谷歌i o被推舉為官方開發語言,但是問題還是有的。plugin supporting feature facet kotlin language is currently disabled.可以更新kotlin外掛程式試試。unable to parse ...
Android Kotlin 開發之旅
kotlin語言推出已經兩年之久了,作為一種火熱的全棧開發語言,本人卻一直沒有正式在專案中使用,最近專案重構中需要使用kotlin語言,這篇部落格也作為乙個學習筆記。在專案的bulid.gradle 中配置 buildscript dependencies kotlin 支援擴充套件,使用kotli...
Android Kotlin 委託(十一)
六句讓我們瞬間頓悟的話 1.概念 委託模式是軟體設計模式中的一項基本技巧。在委託模式中,有兩個物件參與處理同乙個請求,接受請求的物件將請求委託給另乙個物件來處理。kotlin 直接支援委託模式,更加優雅,簡潔。kotlin 通過關鍵字 by 實現委託。2.類委託 類的委託即乙個類中定義的方法實際是呼...