Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Kotlin 扩展函数是特定类的成员函数吗?_Kotlin - Fatal编程技术网

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

Kotlin 扩展函数是特定类的成员函数吗?,kotlin,Kotlin,这里给出了两个类A和B。类A有一个扩展函数作为sub(),派生类B也有一个同名函数sub()。如果扩展函数是类A的成员函数,那么为什么不能通过super关键字访问它 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 ca

这里给出了两个类A和B。类A有一个扩展函数作为sub(),派生类B也有一个同名函数sub()。如果扩展函数是类A的成员函数,那么为什么不能通过super关键字访问它

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()
}
开放类A(变量s:Int){
变量a:Int=5
变量b:Int=4
变量c:Int=0
构造函数():这(7){
//println(“已调用A类构造函数!!!”)
println(“主构造函数值为$s”)
}
乐趣添加(h:Int){
c=a加(b)
println(“h代表A类$h”)
}
有趣的事(){
println(“a&b总额为$c”)
}
}
乐趣A.sub(){
println(“类A的子类是${A.减(b)}”)
}
B类:A{
构造函数(){
println(“B类的主构造函数”)
}
趣味小组(){
super.sub();
println(“B类的子类是${a.减(B)}”)
} 
}
趣味主线(args:Array){
var b=b()
b、 加(2)
b、 dis()
b、 分()
}

扩展函数不是类的成员。它们本质上是静态方法,在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

扩展函数是一个成员函数,但我不知道为什么我们不能用super关键字来调用它,但我们有另一种方法来像super一样调用它。。因此,修改了您的代码,如下所示

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)}")
    } 
}

不,扩展函数不是类a的成员函数。这可以帮助你:也可以看到这个@yole..我知道它可能是真的或不是,但我需要理由。。根据via超级关键字,它不可访问,然后证明它不是成员函数。谢谢兄弟。。。它的作品!!也许它是专门为扩展功能而添加的。。!!扩展函数不是该类的成员,这就是为什么不能重写它们或使用super,这就是为什么使用类型转换。另外,请看一下[kotlin中的扩展函数使用super]()@mTak。。我得到了答案。。这是一种静态方法吗!?不,它不是静止的,也不是静止的。从文档中可以看出:“Kotlin,…,提供了用新功能扩展类的能力,而无需从类继承或使用任何类型的设计模式,如Decorator。”