我有这个代码
open class Shape {
open fun number(m: Shape) = "1"
open fun number(m: Rectangle) = "2"
}
class Rectangle : Shape() {
override fun number(m: Shape) = "3"
override fun number(m: Rectangle) = "4"
}
fun main() {
val shape: Shape = Rectangle()
println(shape.number(shape))
}
我期望打印
4
,但实际上是3
:动态调度是如何工作的?即使对象相同,调用的函数也是Rectangle#number(Shape)
,shape
。
函数
number(m: Shape)
和number(m: Rectangle)
是重载,它们不是动态调度的,而是静态调度的。 Rectangle
中定义的函数是Shape
中函数的覆盖,并且它们是动态调度的。
我认为大多数编程语言都是一样的。
请参阅: