无需依靠继承和装饰者模式来扩展一个类的功能,通过扩展的特殊声明实现
可以通过扩展函数替代工具类
一、扩展函数
- 把一个类的类名作为前缀,在函数内可以直接使用该类的对象
this
。如扩展Activity
的功能
fun Activity.startActivity(cls: Class<*>) {
startActivity(Intent(this, cls))
}
- 扩展函数是静态的。扩展没有实际修改他们所扩展的类,并没有给原有的类插入新的成员,即他的值是被引用时的对象类型决定。编译器会提醒
open class Person
class Student: Person()
fun Person.name() = "person"
fun Student.name() = "student"
fun printPerson(person: Person){
println(person.name())
}
fun main() {
// 打印为 person
printPerson(Student())
}
- 扩展函数和成员函数的名称、参数列表、返回值相同时,调用的是成员函数。编译器会提醒
class Person{
fun play(){ }
}
fun Person.play(){ }
二、扩展属性
把一个类的类名作为前缀,通过 get()/set()
扩展一个类的属性
class Person
val Person.name: String
get() = "wmj"
// 编译出错。Extension property cannot be initialized because it has no backing field
val Person.name: String = "wmj"