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