Kotlin 笔记 3.3:扩展属性和扩展方法

这个功能我感觉挺棒的,Kotlin 中可以对一个类进行扩展,而并不需要去继承这个类,支持扩展函数和扩展属性

扩展函数

扩展函数可以给原有的类添加新的方法,而不需要对原类做任何修改,格式也很简单

fun 原类名.新函数名(函数参数){
    ...函数体
}

例如:

fun main() {
    var person = Person("张三")
    person.say("你好")
    person.sing("七里香")
}

class Person(name: String) {
    var name: String = name
    fun say(word: String) {
        println("$name 说的是 $word")
    }
}

fun Person.sing(song: String) {
    this.name = "$name$name"
    println("$name 唱的是 $song")
}
//输出内容:
张三 说的是 你好
张三张三 唱的是 七里香

可见,在扩展函数中,要想使用被扩展对象原有的属性或者方法,可以使用 this 关键字。

如果拓展函数跟类中原有函数重名,并且参数相同,那么会优先使用原有函数:

fun main() {
    var person = Person("张三")
    person.say("你好")

}

class Person(var name: String) {
    fun say(word: String) {
        println("$name 说的是 $word")
    }
}

fun Person.say(song: String) {
    this.name = "$name$name"
    println("$name 唱的是 $song")
}
//输出结果:张三 说的是 你好

当然,你可以通过不同的参数,来区分同名函数:

fun main() {
    var person = Person("张三")
    person.say("你好",5)

}

class Person(var name: String) {
    fun say(word: String) {
        println("$name 说的是 $word")
    }
}

fun Person.say(song: String, time: Int) {
    this.name = "$name$name"
    println("$name 唱的是 $song,歌曲时长:$time 分钟")
}

//输出内容是:张三张三 唱的是 你好,歌曲时长:5 分钟

扩展并不是创建了一个新的类,原类也并没有修改,只是通过这个类的对象去调用那个新的函数(虽然这个函数并不在类中)

扩展属性

Kotlin 同样也支持属性扩展,但是还记得 幕后字段 么,对于扩展属性来说,幕后字段是不能使用的,所以它是不能有初始值的,只能通过 setter 和 getter 方法去操作:

fun main() {
    var person = Person("张", "三")
    println(person.fullName)
}

class Person(var firstName: String, var lastName: String) {
}

var Person.fullName: String
    get() = this.firstName + this.lastName
    set(value) {

    }