这个功能我感觉挺棒的,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) {
}