Функция расширения в котлине с использованием супер - PullRequest
0 голосов
/ 04 июля 2018

Как вызвать функцию расширения базового класса в производном классе, используя ключевое слово 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 голосов
/ 04 июля 2018

Это будет делать:

(this as abc).sum()

super не работает, так как функции расширения не являются членами базового класса, которые должны быть переопределены в производных классах.

0 голосов
/ 04 июля 2018

Когда вы создали расширение вне класса, оно больше не является членом этого класса. Вы можете позвонить 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()
}

Для получения дополнительной информации см. ссылку

0 голосов
/ 04 июля 2018

Этот тип конфликта пространства имен является общим недостатком методов расширения. Методы расширения по существу статичны и плохо сочетаются с наследованием .

В вашем конкретном случае, похоже, нет необходимости, чтобы функция sum была методом расширения. Если вы измените его на open виртуальный метод, вы сможете лучше проектировать для наследования и потенциального переопределения в подклассе.

...