扩展函数是特定类的成员函数吗?

时间:2018-07-06 16:37:22

标签: kotlin

这里给A和B类提供了两个类.A类具有作为sub()的扩展函数,派生类B也具有相同的名称函数sub()。如果扩展函数是A类的成员函数,那么为什么它不能通过超级关键字访问????

open class A(var s : Int){
    var a : Int = 5
    var b : Int = 4
    var c : Int = 0
    constructor() : this(7) {
        //println("class A constructor has been called !!!")
        println("primary constructor value is $s")
    }
   fun add(h:Int) {
        c = a.plus(b)
        println("h is for class A $h")
    }
    fun dis(){
        println("sum of a & b is $c")

    }
}
fun A.sub(){

    println("sub of class A is ${a.minus(b)}")

}
class B: A{

    constructor(){
        println("primary constructor for class B")

    }
    fun sub(){
        super.sub();
        println("sub of class B is ${a.minus(b)}")

    } 

}
fun main(args:Array<String>){
    var b = B()
    b.add(2)
    b.dis()
    b.sub()
}

2 个答案:

答案 0 :(得分:1)

扩展功能不是该类的成员。它们本质上是静态方法,当在Kotlin中键入它们时方便地作为成员出现。

您无法访问接收者对象的任何私有成员:

class MyClass(private val b : Int) { }

fun MyClass.extFun() = b // Cannot access 'b': it is private in 'MyClass'

从Java调用时,语法如下:

MyClassKt.extFun(myClass);  // if extension is in file MyClass.kt

答案 1 :(得分:1)

扩展功能是成员函数,但是我不知道我们不能使用super关键字来调用它,但是我们有另一种方法来像super一样调用它。因此,如下所示修改了代码。 / p>

fun A.sub(){
    println("sub of class A is ${a.minus(b)}")
}
class B: A{
    constructor(){
        println("primary constructor for class B")
    }
    fun sub(){ 
         (this as A).sub()
         println("sub of class B is ${a.minus(b)}")
    } 
}