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" —— 扩展接收者静态解析
本文来自博客园,作者:DeDeDi,转载请注明原文链接:https://www.cnblogs.com/gdut-chj/articles/7730236.html

浙公网安备 33010602011771号