将扩展作为成员变量

在类的内部,可以为另一个类定义一个扩展。在这样的扩展中,有很多隐式的接收者-可以不是修饰符访问的对象成员。在扩展被声明的类中的实例被称为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 receiverextension 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

results matching ""

    No results matching ""