使用 super 在 kotlin 中扩展函数

extension function in a kotlin using super

如何使用 super 关键字在派生 class 中调用基 class 的扩展函数?

我尝试使用 super 调用,但它不起作用。

 open class abc {
     open fun aa() {
         println("function in abc")
     }
 }
 fun abc.sum() {
     println("extension function")
 }
 class ab: abc() {

     override fun aa() {
         super.aa()
         println("functon in ab")
     }
     fun sum() {
         super.sum()
         println("sum function")
     }
 }
 fun main(args: Array < String > ) {
     var aa: ab = ab()
     aa.aa()
     aa.aa()
     aa.sum()
 }

这里是第16行错误,无法调用扩展函数

这种命名空间冲突是扩展方法的普遍缺陷。扩展方法本质上是静态的并且 do not mix well with inheritance.

在您的特定情况下,函数 sum 似乎不需要成为扩展方法。如果将其更改为 open 虚拟方法,您将能够更好地设计子类中的继承和潜在重写。

这样做:

(this as abc).sum()

super 不起作用,因为扩展函数不是基 class 的成员,将在派生 classes.

中被覆盖

当您从 class 创建扩展时,它不再是 class 的成员。您可以调用 super.aa(),因为它是 abc class.

的成员

为了使用该方法,您必须按以下方式调用它。

open class abc {
    open fun aa() {
        println("function in abc")
    }
}
fun abc.sum() {
    println("extension function")
}
class ab: abc() {

    override fun aa() {
        super.aa()
        println("functon in ab")
    }
    fun sum() {
        (this as abc).sum()
        println("sum function")
    }
}
fun main(args: Array < String > ) {
    var aa: ab = ab()
    aa.aa()
    aa.aa()
    aa.sum()
}

有关更多信息,请参阅此 link