1. 程式人生 > 其它 >【Kotlin】初識Kotlin之擴充套件函式與屬性

【Kotlin】初識Kotlin之擴充套件函式與屬性

【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原始碼中定義了大量的擴充套件,例如:letrunapplywith,瞭解這些擴充套件函式的作用可以大大提高我們的程式碼效率!

我在網上發現了一篇寫的非常詳細的Kotlin常用擴充套件函式的博文,直接指路!

Kotlin專題「一」:你瞭解Kotlin的let,with,run,apply,also作用域函式的區別嗎?