这里给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()
}
答案 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)}")
}
}