摘自官网解释:
Kotlin 可以对一个类的属性和方法进行扩展,且不需要继承或使用 Decorator 模式
扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响
扩展函数
fun receiverType.functionName(params){
body
}
fun Float.toPx(): Float {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
this,
Resources.getSystem().displayMetrics
)
}
注:创建这样一个kt文件,按照以上这个方式写出来的方法,是属于receiverType这个类吗?不是的,它不属于任何一个类,是一个顶层函数Top-level Function,属于所在的包。为什么能够被receiverType的对象调用呢?实际是限定了扩展函数只有通过receiverType类型才能调用。
成员扩展函数
class Exp {
fun String.method() {
println("---->>>")
}
fun startTest() {
"test".method()
}
}
注:这种成员的扩展函数,调用范围只能在这个类的内部,外部不能调用
扩展属性
val Float.dp
get() = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, this, Resources.getSystem().displayMetrics)
注:扩展属性只能被声明为 val,不允许被初始化,只能由显式提供的 getter/setter 定义。
扩展函数是静态解析
在kotlin中扩展是静态分发的,不是根据接收者类型的虚方法。也就是说调用扩展函数是由调用所在的表达式类型来决定的,而不是由表达式运行时求值结果决定的。例如:
open class C
class D: C()
fun C.name() = "cName" // 扩展函数 foo
fun D.name() = "dName" // 扩展函数 foo
fun printFoo(c: C) {
println(c.name()) // 类型是 C 类
}
fun main(arg:Array<String>){
printFoo(D())
}