【Kotlin】初識Kotlin之擴充套件函式與屬性
阿新 • • 發佈:2022-02-25
【Kotlin】初識Kotlin之擴充套件函式與屬性
1、擴充套件函式
在Kotlin中,對於已經定義好的class,我們可以使用擴充套件函式的方式,給這個類動態擴充套件一個函式方法,使用方法也很簡單,看下面例子就懂了:
fun main() {
fun String.getLastChar() = this[this.length-1]
println("woodwhale".getLastChar())
}
上面的例子中,我們在main函式中寫了一個tring.getLastChar()
函式,這是對String
類拓展了一個getLastChar()
函式,作用就是獲取最後一位的Char
在上述拓展函式中,this
指的是當前這個物件,也就是自己這個字串。在寫拓展函式的時候我們可以具體分析情況來使用this
上述程式碼也可以這麼寫:
fun main() {
println("woodwhale".getLastChar())
}
fun String.getLastChar(): Char {
val index = this.length - 1
return this[index]
}
從中我們可以看到,擴充套件函式可以在任何地方定義
如果是內部類、巢狀類中的方法,或者伴生類中的方法,也可以使用同樣的方式來拓展
fun main() { fun Test.Companion.sout() = println("伴生類拓展函式") Test.sout() fun Test.InnerTest.sout() = println("內部類拓展函式") Test().InnerTest().sout() fun Test.TestB.sout() = println("巢狀類拓展函式") Test.TestB().sout() } class Test { class TestB { } inner class InnerTest { } companion object { } } /* 伴生類拓展函式 內部類拓展函式 巢狀類拓展函式 程序已結束,退出程式碼0 */
需要注意的是,如果擴充套件的函式名已經存在了原來的類中,那麼或預設呼叫類中的成員方法
fun main(args: Array<String>) {
val extension = ExtensionTest()
// 此處呼叫的會是成員方法
extension.test()
}
class ExtensionTest {
fun test() = print("成員方法")
}
// 該方法不會被呼叫
fun ExtensionTest.test() = println("擴充套件方法")
2、擴充套件屬性
在瞭解了擴充套件函式之後,我們也就不難理解擴充套件屬性了
同樣的方式來定義一個擴充套件的屬性
但是在使用之前,我們需要知道擴充套件屬性的幾個限制:
- 擴充套件屬性不能有初始值
- 擴充套件屬性不能用filed關鍵字訪問幕後欄位
- val必須提供get方法,var必須提供get和set方法。
class Test {
val name = "woodwhale"
class TestB {
}
inner class InnerTest {
}
companion object {
}
}
val Test.property: String get() = this.name.uppercase()
val Test.TestB.property : String get() = Test().name.uppercase()
val Test.InnerTest.property: String get() = Test().name.uppercase()
val Test.Companion.property: String get() = Test().name.uppercase()
fun main() {
println(Test().property)
println(Test.property)
println(Test.TestB().property)
println(Test().InnerTest().property)
}
3、Kotlin中常用的擴充套件
在Kotlin原始碼中定義了大量的擴充套件,例如:let
、run
、apply
、with
,瞭解這些擴充套件函式的作用可以大大提高我們的程式碼效率!
我在網上發現了一篇寫的非常詳細的Kotlin常用擴充套件函式的博文,直接指路!