Kotlin学习笔记-类中扩展

在一个类内部你可以为另一个类声明扩展。在这样的扩展内部,有多个 隐式接收者 —— 其中 的对象成员可以无需通过限定符访问。扩展声明所在的类的实例称为 分发接收者,扩展方法 调用所在的接收者类型的实例称为 扩展接收者 。

class D {
fun bar() { …… }
}
class C {
fun baz() { …… }
fun D.foo() {
bar() // 调用 D.bar
baz() // 调用 C.baz
}
fun caller(d: D) {
d.foo() // 调用扩展函数
}
}

 

对于分发接收者和扩展接收者的成员名字冲突的情况,扩展接收者优先。要引用分发接收者 的成员你可以使用 限定的 this 语法。

class C {
fun D.foo() {
toString() // 调用 D.toString()
this@C.toString() // 调用 C.toString()
}

 

声明为成员的扩展可以声明为 open 并在子类中覆盖。这意味着这些函数的分发对于分发接 收者类型是虚拟的,但对于扩展接收者类型是静态的。

open class D {
}
class D1 : D() {
}
open class C {
open fun D.foo() {
println("D.foo in C")
}
open fun D1.foo() {
println("D1.foo in C")
}
fun caller(d: D) {
d.foo() // 调用扩展函数
}
}
class C1 : C() {
override fun D.foo() {
println("D.foo in C1")
}
override fun D1.foo() {
println("D1.foo in C1")
}
}
C().caller(D()) // 输出 "D.foo in C"
C1().caller(D()) // 输出 "D.foo in C1" —— 分发接收者虚拟解析
C().caller(D1()) // 输出 "D.foo in C" —— 扩展接收者静态解析

 

posted @ 2017-10-25 17:44  DeDeDi  阅读(261)  评论(0)    收藏  举报