如何在Kotlin子类中调用祖父类(父类的父类)的方法?
如何在Kotlin中跳过直接父类调用祖父类的重写方法
在Kotlin中,没有类似C++里A::f()这种直接跳过父类调用祖父类方法的语法——这是语言出于封装性的设计,避免子类绕过直接父类的逻辑约束。要实现你的需求,最合规的方式是在直接父类B中添加一个方法,专门用来暴露对祖父类A的f()调用。
修改后的代码示例:
open class A { open fun f() { println("A::f()") } } open class B : A() { override fun f() { println("B::f()") } // 添加受保护方法,用于调用A类的f() protected fun callAF() { super.f() } } class C : B() { override fun f() { callAF() // 调用A类的f() println("C::f()") } } fun main() { val c = C() c.f() // 输出结果: // A::f() // C::f() }
为什么不能直接用super.super?
Kotlin明确禁止super.super这类调用,因为直接父类B重写f()后,相当于定义了自己的行为契约。如果允许子类跳过B直接调用A的方法,会破坏B类的封装逻辑,可能导致程序行为不符合预期。
不推荐的替代方案(反射)
如果无法修改B类,也可以通过反射实现,但这种方式不安全且违背设计原则,仅作了解:
class C : B() { override fun f() { val method = A::class.java.getDeclaredMethod("f") method.isAccessible = true method.invoke(this) println("C::f()") } }
内容的提问来源于stack exchange,提问作者Abdo21
相关产品推荐
相关产品推荐

