使用super在kotlin中扩展功能

时间:2018-07-04 09:21:13

标签: kotlin kotlin-extension

如何使用super关键字在派生类中调用基类的扩展功能?

我尝试使用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号数字错误,我无法调用扩展功能。

3 个答案:

答案 0 :(得分:4)

这可以做到:

(this as abc).sum()

super不起作用,因为扩展功能不是要在派生类中重写的基类的成员。

答案 1 :(得分:2)

这种类型的名称空间冲突是扩展方法的普遍缺陷。扩展方法本质上是静态的,do not mix well with inheritance

在您的特定情况下,似乎不需要将功能sum用作扩展方法。如果将其更改为open虚拟方法,则可以为子类中的继承和潜在的覆盖设计得更好。

答案 2 :(得分:1)

在类之外创建扩展时,该类不再是该成员。您可以调用super.aa()类,因为它是abc类的成员。

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

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