扩展函数
扩展是一种静态行为,对被扩展的类代码本身不会造成任何影响。
创建一个类Example:
class Example(var name:String)
创建一个类A:
class A{
init{
val ex = Example("")
ex.Print()
}
/**扩展函数**/
fun User.Print(){
do {
v++
}while (v > 0)
print("v = $v")
print("用户名 $name")
}
this关键字指代接收者对象(receiver object)(也就是调用扩展函数时, 在点号之前指定的对象实例)。
扩展函数是静态解析的
扩展函数是静态解析的,并不是接收者类型的虚拟成员,在调用扩展函数时,具体被调用的的是哪一个函数,由调用函数的的对象表达式来决定的,而不是动态的类型决定的:
open class C
class D: C()
fun C.foo() = "c" // 扩展函数 foo
fun D.foo() = "d" // 扩展函数 foo
fun printFoo(c: C) {
println(c.foo()) // 类型是 C 类
}
fun main(arg:Array<String>){
//这里动态传入D是无效的 ,因为扩展函数只能是静态解析的 所以最终运行结果是 "c"
printFoo(D())
}
若扩展函数和成员函数一致,则使用该函数时,会优先使用成员函数。
class C {
fun foo() { println("成员函数") }
}
fun C.foo() { println("扩展函数") }
fun main(arg:Array<String>){
var c = C()
c.foo()
}
/先执行成员函数