You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:17:42