1.擴展函數
擴展函數,顧名思義就是對已經存在的類添加新的函數,在新的函數體中可以調用自身的屬性,函數或者自身對象。
//爲String類添加擴展函數lastChar
//get爲String的自帶方法,legth爲自帶屬性
fun String.lastChar(): Char = get(length - 1)
//爲Int 添加doubleValue擴展函數,this爲自身
fun Int.doubleValue(): Int = this * 2
fun test() {
var name = "weishixiong"
println(name.lastChar())
var value = 10
println(value.doubleValue())
}
添加靜態的擴展函數
//爲MyExtent添加靜態的擴展函數 getValue
fun MyExtent.Companion.getValue():Int = value
fun main() {
println(MyExtent.getValue())
}
//爲MyExtent添加靜態的擴展函數 getDouvleValue
fun MyExtent.Companion.getDouvleValue(): Int {
return value * 2
}
class MyExtent {
companion object {
//靜態成員
val value = 10
}
}
2.擴展屬性
爲String 類添加屬性doubleLength
fun main() {
var value = "weishixiong"
println(value.doubleLength)
}
var String.doubleLength: Int
get() = length * 2
set(value) {
}
3.不可以重寫的擴展函數
我們先看下面這段代碼
fun main() {
var view: MyView = MyButton()
view.click()
view.longClick()
}
open class MyView{
open fun click(){
println("MyView....")
}
}
class MyButton:MyView(){
override fun click(){
println("MyButton....")
}
}
fun MyView.longClick() = println("MyView....")
fun MyButton.longClick() = println("MyButton....")
在上面的代碼中,我們創建了MyView和MyButton類,MyButton繼承MyView。我們通過 var view: MyView = MyButton()創建MyView類型的MyButton對象,此時此刻去調用click方法,我們都知道這個時候調用的是子類MyButton中的click方法。這個地方是根據MyButton具體創建的對象來調用。而我們分別給他們兩個類添加了longClick擴展函數,在去調用longClick函數,此時此刻調用的是MyView中的擴展函數longClick。我們看打印結果。所以調用擴展函數的時候,是根據聲明的對象類型來調用,也就是var view: MyView中聲明的是MyView類型。所以調用擴展函數的時候,調用了MyView的擴展函數。
MyButton....
MyView....