jvm对象结构有一个指向可用方法表的内部指针。当您调用对象的方法时,jvm访问这个表(我们称之为vtable),如果找到方法,它就会执行它。但是如果没有找到方法怎么办?然后尝试在父类中找到此方法。可以在编译期间检测这些访问,这有助于避免在运行时调试复杂的问题。
现在,让我们假设你的例子是可能的。你有一个实现
ShipState
而且,通过它,它还实现了
SimulationState
. 你实现你的方法
integrate
从接口
船舶状态
(具有3个参数的一个)。
但是等等,你的物品仍然是
模拟状态
对吧?现在让我们假设您想要创建一个模拟集合,并以单一方式处理它们:
val simpleSimulation = SimulationStateImpl() //imaginary implementation of base interface
val shipSimulation = ShipSimulationImpl() // again imaginary implementation
val simulations = listOf(simpleSimulation, shipSimulation)
simulations.forEach { it.integrate(totalTime = 100, deltaTime = 50) }
接下来会发生什么?在第一次迭代中,一切都很好。当你打电话
整合
在
simpleSimulation
JVM访问它的VTABLE,发现实现
整合
用两个参数调用它。好的。
在第二次迭代中,jvm访问对象的vtable
shipSimulation
. 它试图解决方法
整合
有两个参数,没有找到。好吧,下一步怎么办?有类似的方法有三个参数,我们应该称之为吗?如果是,我们需要传递哪些参数?
null
?为什么?如果你的类似方法有5个参数,你该怎么办?编译器和运行时无法解决这些问题,这就是它失败的原因。
就java/kotlin oop而言,您要做的不是
override
. 你只是在一个新的界面中添加了新的方法,这是巧合的,看起来和另一个非常相似。然而,这种巧合并不意味着它是同样的方法。