Kotlin:你能解释一下会员推广功能吗?

时间:2017-03-13 20:46:47

标签: function extension-methods kotlin

我的代码如下:

open class Particle

class Electron : Particle()

open class Element(val name: String) {

    open fun Particle.react(name: String): Unit {
        println("$name is reacting with a particle")
    }

    open fun Electron.react(name: String): Unit {
        println("$name is reacting with an electron")
    }

    fun react(particle: Particle): Unit {
        particle.react(name)
    }

}

fun main(args: Array<String>) {
    val selenium = Element("Selenium")
    selenium.react(Particle())
    selenium.react(Electron())
}

我的输出如下:

硒与粒子反应

硒与粒子反应

我不明白:为什么第二个输出不应该是#34; Selenium正在与电子反应&#34;?

如果我添加了另一个子类

class NobleGas(name: String) : Element(name) {

    fun react(particle: Electron): Unit {
        particle.react(name)
    }

}

fun main(args: Array<String>) {
    val neon = NobleGas("Selenium")
    neon.react(Particle())
    neon.react(Electron())
}

输出是: 硒与颗粒反应 硒与电子反应

为什么第二个输出是&#34; Selenium正在与电子反应&#34;?

1 个答案:

答案 0 :(得分:2)

扩展函数编译为静态函数调用,因此调用哪个方法由编译时静态类型而不是对象的运行时类型确定。

这里没有动态调度,就像你调用一个在子类中重写的方法而得到的那样,你得到的是实现,而不是基类中的实现。基本上,没有重要的扩展功能。

具体示例:在编译时,在react(particle: Particle)函数内,particle的静态类型在编译时只是Particle,所以它总是调用扩展函数& #39;在Particle类上定义。