Kotlin中如何调用被重写的扩展方法的父类实现?
结论
Kotlin支持调用父类中定义的成员扩展函数的super实现,你遇到的编译错误是因为语法使用不正确,该类扩展函数同时存在分发接收者(定义扩展的A/C类实例)和扩展接收者(被扩展的B类实例),需要用特殊语法指定两个接收者的对应关系。
正确实现代码
把C类中重写的扩展方法修改为以下写法即可正常编译运行:
class C : A() { override fun B.doSomething() { print("first, do some C-specific logic") print("now try to call super implementation. How?") // 正确调用父类实现的写法 super<A>.run { doSomething() } } }
原错误写法说明
super.doSomething():未指定super对应的接收者类型,编译器无法区分是分发接收者的父类还是扩展接收者的父类,编译失败super<A>.doSomething():doSomething是B的扩展方法,调用时必须传入B类的扩展接收者,该写法缺少扩展接收者参数,编译失败super<B>.doSomething():B类本身没有定义doSomething成员方法,该方法是A类中定义的扩展,匹配不到对应实现,编译失败
原理说明
类内部定义的成员扩展函数本质是包含两个隐含参数的类成员:第一个参数是扩展所属类的实例(分发接收者),第二个参数是被扩展类的实例(扩展接收者)。上面的正确写法通过super<A>.run切换分发接收者的作用域到父类A的super实例,当前重写方法内的B实例会自动作为扩展接收者传入,就能正常调用到父类的实现。
内容的提问来源于stack exchange,提问作者user16038501
相关产品推荐
相关产品推荐

