Kotlin中可以扩展原始类型的函数和属性,原始类型称为“接受类型”.
扩展函数
在接收类型上添加扩展函数,语法如下:
fun 接收类型.函数名(参数列表) : 返回值类型 {
函数体
return 返回值
}
看完语法,撸代码:
class Student {
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
var name: String = ""
var age: Int = 0
}
//拓展函数
fun Student.desc(): String {
return "name : ${this.name} ,age : ${this.age}"
}
fun main(args: Array<String>) {
val student =Student("Rose",20)
println(student.desc())
}
输出结果:

通过对Student对象进行函数的拓展,在初始化完成进行拓展函数的调用,则可实现控制台的输出结果,这样的方式可以避免通过继承的方式拓展多余的功能!方便,还节省了代码的编写!
扩展属性
在接收类型上添加拓展属性,具体语法如下:
var|val 接收类型.属性名称 [:数据类型 ]
[getter 访问器]
[settter 访问器]
可扩展属性与普通属性在声明是的区别就是在属性名前边加上“接收类型”。接收数据类型可以是任意kotlin数据类型,包括基本数据类型和引用类型。
class Student {
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
var name: String = ""
var age: Int = 0
}
//拓展属性
var Student.desc: String
get() = "{Student: [ name = ${this.name} ,age=${this.age}]}"
set(value) {
println(value)
}
fun main(args: Array<String>) {
val student = Student("Rose", 20)
println(student.desc)
}
运行代码结果:

通过代码和运行结果可以看出定义了Student对象desc属性,在main方法中,初始化对象并调用去拓展属性,得到了我们预期的效果!
成员优先原则
无论是拓展属性还是拓展函数,如果接收类型成员中已经有相同的属性或者函数,那么在调用属性和函数时,始终是调用接收类型的成员属性和函数,这就是“成员优先”原则。
示例代码:
class Student {
constructor(name: String, age: Int) {
this.name = name
this.age = age
}
var name: String = ""
var age: Int = 0
//成员属性
var desc:String ="成员 :{Student: [ name = ${this.name} ,age=${this.age}]}"
//成员函数
fun desc(): String {
return "成员:name : ${this.name} ,age : ${this.age}"
}
}
//扩展属性
var Student.desc: String
get() = "扩展 :{Student: [ name = ${this.name} ,age=${this.age}]}"
set(value) {
println(value)
}
//扩展函数
fun Student.desc(): String {
return "扩展:name : ${this.name} ,age : ${this.age}"
}
//扩展函数
fun Student.descs(): String {
return "扩展:name : ${this.name} ,age : ${this.age}"
}
fun main(args: Array<String>) {
val student = Student("Rose", 20)
println(student.desc)
println(student.desc())
println(student.descs())
}
运行代码结果:

由上边运行结果可以看出,对象调用了desc()/desc (成员函数(属性),扩展函数(属性)),输出结果是成员属性(函数)的执行结果,而descs()是扩展函数,在成员函数中不存在,则结果是扩展函数的结果!由此看出在成员属性(函数),扩展属性(函数)相同情况下,履行成员优先的原则!
网友评论