【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作用域函数的区别吗?

posted @ 2022-02-25 19:30  woodwhale  阅读(148)  评论(0编辑  收藏  举报