将扩展作为成员变量
在类的内部,可以为另一个类定义一个扩展。在这样的扩展中,有很多隐式的接收者-可以不是修饰符访问的对象成员。在扩展被声明的类中的实例被称为dispatch receiver,扩展方法的接收类型的实例被称为extension receiver。
class D {
fun bar() { ... }
}
class C {
fun baz() { ... }
fun D.foo() {
bar() // calls D.bar
baz() // calls C.baz
}
fun caller(d: D) {
d.foo() // call the extension function
}
}
为了防止dispatch receiver和extension receiver之间的名字冲突,extension receiver具有优先的权利。为了指向dispatch receiver的成员你可以使用this语法。
class C {
fun D.foo() {
toString() // calls D.toString()
[email protected]() // calls C.toString()
}
扩展被定义为成员可以使用open进行声明,也可以被子类重写。这意味着分发这样的函数dispatch receiver类型是虚拟调度的,但是extension receiver类型又是采用静态的方式。
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() // call the extension function
}
}
class C1 : C() {
override fun D.foo() {
println("D.foo in C1")
}
override fun D1.foo() {
println("D1.foo in C1")
}
}
fun main(args: Array<String>) {
C().caller(D())
C1().caller(D())
C().caller(D1())
}
将打印出:
D.foo in C
D.foo in C1
D.foo in C